File: vec.h

package info (click to toggle)
virtuoso-opensource 7.2.12%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 299,780 kB
  • sloc: ansic: 655,047; sql: 508,209; xml: 269,573; java: 84,064; javascript: 79,847; cpp: 37,662; sh: 32,429; cs: 25,702; php: 12,690; yacc: 11,661; lex: 7,933; makefile: 7,309; jsp: 4,523; awk: 1,719; perl: 1,013; ruby: 1,003; python: 326
file content (296 lines) | stat: -rw-r--r-- 12,867 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
/*
 *  vec.h
 *
 *  $Id$
 *
 *  Vectored execution
 *
 *  This file is part of the OpenLink Software Virtuoso Open-Source (VOS)
 *  project.
 *
 *  Copyright (C) 1998-2024 OpenLink Software
 *
 *  This project is free software; you can redistribute it and/or modify it
 *  under the terms of the GNU General Public License as published by the
 *  Free Software Foundation; only version 2 of the License, dated June 1991.
 *
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 *  General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 *
 */


typedef void (*col_ref_t) (it_cursor_t * itc, buffer_desc_t * buf, dbe_col_loc_t * cl, caddr_t * qst, state_slot_t * target);


typedef struct v_out_map_s
{
  col_ref_t om_ref;
  state_slot_t *om_ssl;		/* the vector */
  state_slot_t *om_row_ssl;	/* the single value for local test/code */
  dbe_col_loc_t om_cl;
  char om_is_null;
  unsigned char om_ce_op;
} v_out_map_t;





#define DCT_FROM_POOL 1
#define DCT_REF 16		/* values are refs to another dc, lengths are copied from the source dc */
#define DCT_BOXES 32		/* the values are dv boxes.  If DCT_REF is not set, then the boxes are owned by this */
#define DCT_NUM_INLINE 64	/* if this dct occurs as search paramm, the param in itc_search_params is a box of the right type (int or iri id) */




typedef int (*dc_cmp_t) (data_col_t * dc, int r1, int r2, int r_prefetch);

struct data_col_s
{
  sql_type_t dc_sqt;
  char dc_any_null;
  char dc_type;
  dtp_t dc_org_dtp;
  int dc_n_values;		/* count of values */
  int dc_n_places;		/* max no of values for which there is space */
  int dc_buf_len;		/* total bytes in var len dc buffer */
  int dc_buf_fill;		/* bytes used from dc_buffer */
  int dc_org_places;		/* allocd element count  of dc_org_values */
  int dc_min_places;		/* when converting between dtps w different elt sz, resulting dc must have at least this many places.  0 means same as dc_n_places */
  db_buf_t dc_values;
  db_buf_t dc_nulls;
  db_buf_t dc_buffer;
  dk_set_t dc_buffers;		/* if extensible var len, this is the data and the pointers are in dc_values */
  dc_cmp_t dc_sort_cmp;		/* func for comparing values inside this column for sorting */
  mem_pool_t *dc_mp;
  db_buf_t dc_org_values;	/* initial values array if values array is assigned by reference to another dc */
  db_buf_t dc_org_nulls;	/* when getting first null for a num inline dc, use this if this is set and large enough */
#ifndef NDEBUG
    state_slot_t * dc_ssl;
#endif
};

#define dc_dtp dc_sqt.sqt_dtp

typedef struct ts_advice_s
{
  char adv_type;
  char adv_unique;		/* never more than one result per input */
  state_slot_t **adv_results;	/* slots assigned based if not a filter */
  dbe_column_t *adv_col;
  int adv_nth;			/* if many values per input, which one was it at when syspended */
  caddr_t adv_data;
} ts_advice_t;

#define ITC_P_VEC(itc, ip) \
  *((data_col_t**)&itc->itc_search_params[MAX_SEARCH_PARAMS - ip - 1])

#define ITC_VEC_MORE(itc) \
  (itc->itc_set < itc->itc_n_sets && itc->itc_n_results < itc->itc_batch_size)

typedef int (*dc_cast_t) (caddr_t * inst, data_col_t * target, data_col_t * source, int nth);

/* single value cast functions */
typedef int (*dc_val_cast_t) (data_col_t * target_dc, data_col_t * source_dc, int row, caddr_t * err_ret);

int vc_intnn_int (data_col_t * target, data_col_t * source, int row, caddr_t * err_ret);
int vc_anynn_iri (data_col_t * target, data_col_t * source, int row, caddr_t * err_ret);
int vc_irinn_any (data_col_t * target, data_col_t * source, int row, caddr_t * err_ret);
int vc_anynn_any (data_col_t * target, data_col_t * source, int row, caddr_t * err_ret);
int vc_anynn_generic (data_col_t * target, data_col_t * source, int row, caddr_t * err_ret);
int vc_anynn (data_col_t * target, data_col_t * source, int row, caddr_t * err_ret);
int vc_generic (data_col_t * target, data_col_t * source, int row, caddr_t * err_ret);
int vc_box_copy (data_col_t * target, data_col_t * source, int row, caddr_t * err_ret);
int vc_date_date (data_col_t * target, data_col_t * source, int row, caddr_t * err_ret);




extern void DBG_NAME (dc_get_buffer) (DBG_PARAMS data_col_t * dc, int bytes);
#ifdef MALLOC_DEBUG
#define dc_get_buffer(dc,bytes) dbg_dc_get_buffer (__FILE__, __LINE__, (dc), (bytes))
#endif
void dc_reset (data_col_t * dc);
void dc_append_bytes (data_col_t * dc, db_buf_t bytes, int len, db_buf_t pref, int pref_len);
void dc_append_chars (data_col_t * dc, char *field, int field_lem);
void dc_append (data_col_t * target, data_col_t * source, int inx);
void dc_append_box (data_col_t * dc, caddr_t box);
void dc_append_null (data_col_t * dc);
void dc_append_float (data_col_t * dc, float n);
int dc_is_nulll (data_col_t * dc, int set);
/* use as value in inlined num dcs to indicate that null check is to be made. 32 bit and ff at both ends  */
#define DC_MAY_BE_NULL 0xffabcdff
void dc_set_null (data_col_t * dc, int set);
void dc_append_int64 (data_col_t * dc, int64 n);

caddr_t dc_box (data_col_t * dc, int inx);

#define DC_SET_NULL(dc, inx)				\
  {  dc->dc_any_null = 1; \
    dc->dc_nulls[(inx) >> 3] |= (1 << ((inx) & 7)); }

#define DC_CLR_NULL(dc, inx)				\
  {if (dc->dc_any_null) dc->dc_nulls[(inx) >> 3] &= ~(1 << ((inx) & 7));}

#define DC_IS_NULL(dc, inx)				\
  (dc->dc_any_null && dc->dc_nulls[(inx) >> 3] & (1 << ((inx) & 7)))



#define DC_ANY_IS_NULL(dc, inx)				\
  ((dc->dc_nulls) ? (dc->dc_nulls[(inx) >> 3] & (1 << ((inx) & 7))) \
   : DCT_BOXES & dc->dc_type ? DV_DB_NULL == DV_TYPE_OF (((caddr_t*)dc->dc_values)[inx]) \
   : DV_DB_NULL == ((db_buf_t*)dc->dc_values)[inx][0])

#define DC_STR_MARGIN 16

extern int dc_str_buf_unit;
int64 dc_any_value (data_col_t * dc, int inx);
int64  dc_any_value_n (data_col_t * dc, int inx, char * nf);
int64 dc_any_value_prefetch (data_col_t * dc, int inx, int inx2);
int64  dc_any_value_n_prefetch (data_col_t * dc, int inx, int inx2, char * nf);
#define dc_int(dc, inx)  ((int64*)(dc)->dc_values)[inx]
caddr_t dc_mp_box_for_rd (mem_pool_t * mp, data_col_t * dc, int inx);
caddr_t sslr_qst_get (caddr_t * inst, state_slot_ref_t * sslr, int row_no);

int dc_cmp (data_col_t * dc, int64 v1, int64 v2);
void ks_vec_params (key_source_t * ks, it_cursor_t * itc, caddr_t * inst);
void itc_param_sort (key_source_t * ks, it_cursor_t * itc, int del_with_nulls);
col_ref_t col_ref_func (dbe_key_t * key, dbe_column_t * col, state_slot_t * ssl);

int itc_vec_next (it_cursor_t * it, buffer_desc_t ** buf_ret);
int itc_vec_row_check (it_cursor_t * itc, buffer_desc_t * buf);
void itc_vec_box (it_cursor_t * itc, dtp_t dtp, int nth, data_col_t * dc);
extern int32 dc_batch_sz;
extern int32 dc_max_batch_sz;
extern int qp_thread_min_usec;
int itc_param_cmp (int r1, int r2, void *cd);
void itc_set_param_row (it_cursor_t * itc, int nth);
void itc_set_row_spec_param_row (it_cursor_t * itc, int nth);
data_col_t *mp_data_col (mem_pool_t * mp, state_slot_t * ssl, int n_sets);
dtp_t sqt_dc_dtp (sql_type_t * sqt);

/* wen looping over search pars, need to know type of col.  Look it up in the sp.  One sp can cover 2 params and some can be key spec and some row spec.  So check this */
#define NEXT_SP_COL \
{ \
  if (sp2nd || sp->sp_min_op == CMP_NONE || sp->sp_max_op == CMP_NONE) \
    {\
      sp = sp->sp_next; \
      sp2nd = 0;\
    }\
  else \
    sp2nd = 1;\
  if (!sp)\
    {sp = itc->itc_row_specs; is_row_sp = 1; }	\
}

caddr_t itc_temp_any_box (it_cursor_t * itc, int inx, db_buf_t dv);
void dc_set_long (data_col_t * dc, int set, boxint lv);
void dc_set_float (data_col_t * dc, int set, float df);
void dc_set_double (data_col_t * dc, int set, double df);

#define DC_CHECK_LEN(dc, l)					\
  {if (l >= dc->dc_n_places || !dc->dc_values) dc_extend_2 (dc, l);}

void DBG_NAME(dc_extend_2) (DBG_PARAMS  data_col_t * dc, int l);
#ifdef MALLOC_DEBUG
#define dc_extend_2(dc,l) dbg_dc_extend_2 (__FILE__, __LINE__, (dc), (l))
#endif
void dc_pop_last (data_col_t * dc);
int64 qst_vec_get_int64 (caddr_t * inst, state_slot_t * ssl, int row_no);
void qst_set_all (caddr_t * inst, state_slot_t * ssl, caddr_t val);
int sslr_set_no (caddr_t * inst, state_slot_t * ssl, int row_no);
void sslr_n_ref (caddr_t * inst, state_slot_ref_t * sslr, int *sets, int n_sets);
void sslr_n_consec_ref (caddr_t * inst, state_slot_ref_t * sslr, int *sets, int set, int n_sets);
int sslr_nn_ref (caddr_t * inst, state_slot_ref_t * sslr, int *sets, int *group_sets, int set, int n_sets);
int dc_nn_sets (data_col_t * dc, int *sets, int first_set, int n_sets);

void dc_set_all_null (data_col_t * dc, int n_sets, db_buf_t set_mask);
extern char vec_box_dtps[256];
void dc_copy (data_col_t * target, data_col_t * source);
int dc_value_len (data_col_t * dc);
void dc_reserve_bytes (data_col_t * dc, int len);



void dc_itc_delete (it_cursor_t * itc, buffer_desc_t * buf, dbe_col_loc_t * cl,
		    caddr_t * inst, state_slot_t * ssl);
void dc_itc_bm_delete (it_cursor_t * itc, buffer_desc_t * buf, dbe_col_loc_t * cl,
		    caddr_t * inst, state_slot_t * ssl);
void dc_itc_placeholder (it_cursor_t * itc, buffer_desc_t * buf, dbe_col_loc_t * cl,
			 caddr_t * inst, state_slot_t * ssl);
void dc_itc_append_row (it_cursor_t * itc, buffer_desc_t * buf, dbe_col_loc_t * cl,
		    caddr_t * inst, state_slot_t * ssl);

int dc_elt_size (data_col_t * dc);
void dc_assign (caddr_t * inst, state_slot_t * ssl_to, int row_to, state_slot_t * ssl_from, int row_FROM);
void dc_assign_copy (caddr_t * inst, state_slot_t * ssl_to, int row_to, state_slot_t * ssl_from, int row_FROM);
db_buf_t dc_alloc (data_col_t * dc, int bytes);
void dc_reset_alloc (data_col_t * dc);
int qi_sets_identical (caddr_t * inst, state_slot_t * ssl);

#define DC_FILL_TO(dc, dtp, to) \
{ int __inx; \
  for (__inx = dc->dc_n_values; __inx < to; __inx++) \
    ((dtp*)dc->dc_values)[__inx] = 0; \
}

dc_val_cast_t vc_to_any (dtp_t dtp);
void sslr_dc_copy (caddr_t * inst, state_slot_ref_t * sslr, data_col_t * target_dc, data_col_t * source_dc, int n_sets, int dc_elt_len, int copy_anies);
void dc_heterogenous (data_col_t * dc);
void dc_convert_empty (data_col_t * dc, dtp_t dtp);
void dc_set_flags (data_col_t * dc, sql_type_t * sqt, dtp_t dcdtp);
int dc_any_cmp (data_col_t * dc, int r1, int r2, int r_prefetch);
int dtp_is_chash_inlined (dtp_t dtp);
void vec_ssl_assign (caddr_t * inst, state_slot_t * to, state_slot_t * from);
void vec_qst_set_temp_box (caddr_t * qst, state_slot_t * ssl, caddr_t data);

#define DC_HAS_NULL_BITS(dc) \
  ((DCT_NUM_INLINE & (dc)->dc_type) || DV_DATETIME == dtp_canonical[(dc)->dc_dtp])

void dc_ensure_null_bits (data_col_t * dc);
db_buf_t itcp (it_cursor_t * itc, int ip, int set);
caddr_t box_mt_copy_tree (caddr_t box);
int dc_is_null (data_col_t * dc, int set);
caddr_t box_deserialize_reusing (db_buf_t string, caddr_t box);

#define DC_ELT_CPY(target, target_row, source, source_row, l) \
  {if (8 == l) {((int64*)target->dc_values)[target_row] = ((int64*)source->dc_values)[source_row]; \
      if (DCT_BOXES & target->dc_type) ((caddr_t*)target->dc_values)[target_row] = box_copy_tree (((caddr_t*)target->dc_values)[target_row]); } \
    else if (4 == l) ((float*)target->dc_values)[target_row] = ((float*)source->dc_values)[source_row]; \
  else memcpy (target->dc_values + (l) * (target_row), source->dc_values + (source_row) * (l), l);}

#define DC_ELT_MT_CPY(target, target_row, source, source_row, l) \
  {if (8 == l) {((int64*)target->dc_values)[target_row] = ((int64*)source->dc_values)[source_row]; \
      if (DCT_BOXES & target->dc_type) ((caddr_t*)target->dc_values)[target_row] = box_mt_copy_tree (((caddr_t*)target->dc_values)[target_row]); } \
    else if (4 == l) ((float*)target->dc_values)[target_row] = ((float*)source->dc_values)[source_row]; \
  else memcpy (target->dc_values + (l) * (target_row), source->dc_values + (source_row) * (l), l);}



#define NEXT_SET_INL_NULL(dc, set, nth_par)		\
  if (dc->dc_any_null) { \
    box_tag_aux (itc->itc_search_params[nth_par]) = DC_IS_NULL (dc, set) ? DV_DB_NULL : dc->dc_dtp; }

#define NEXT_SET_INL_NULL_ALWAYS(dc, set, nth_par)		\
  if (!dc->dc_sqt.sqt_non_null) { \
    box_tag_aux (itc->itc_search_params[nth_par]) = DC_IS_NULL (dc, set) ? DV_DB_NULL : dc->dc_dtp; }

extern dk_hash_t * cl_dc_func_id;
extern dk_hash_t * cl_id_dc_func;
void  cl_dcf_id (col_ref_t f);

void dc_append_dv_rdf_box (data_col_t * dc, caddr_t box);
caddr_t dc_mp_insert_copy_any (mem_pool_t * mp, data_col_t * dc, int inx, dbe_column_t * col);
void qst_set_with_ref (caddr_t * inst, state_slot_t * ssl, caddr_t val);
extern size_t c_max_large_vec;