Line data Source code
1 : /*
2 : * SPDX-License-Identifier: MPL-2.0
3 : *
4 : * This Source Code Form is subject to the terms of the Mozilla Public
5 : * License, v. 2.0. If a copy of the MPL was not distributed with this
6 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 : *
8 : * Copyright 2024 MonetDB Foundation;
9 : * Copyright August 2008 - 2023 MonetDB B.V.;
10 : * Copyright 1997 - July 2008 CWI.
11 : */
12 :
13 : #include "monetdb_config.h"
14 : #include "sql_relation.h"
15 : #include "sql_semantic.h"
16 : #include "sql_decimal.h"
17 : #include "rel_exp.h"
18 : #include "rel_rel.h"
19 : #include "rel_basetable.h"
20 : #include "rel_prop.h"
21 :
22 : comp_type
23 814363 : compare_str2type(const char *compare_op)
24 : {
25 814363 : comp_type type = cmp_filter;
26 :
27 814363 : if (compare_op[0] == '=') {
28 : type = cmp_equal;
29 159432 : } else if (compare_op[0] == '<') {
30 102511 : type = cmp_lt;
31 102511 : if (compare_op[1] == '>')
32 : type = cmp_notequal;
33 22966 : else if (compare_op[1] == '=')
34 4031 : type = cmp_lte;
35 56921 : } else if (compare_op[0] == '>') {
36 56921 : type = cmp_gt;
37 56921 : if (compare_op[1] == '=')
38 3151 : type = cmp_gte;
39 : }
40 814363 : return type;
41 : }
42 :
43 : comp_type
44 51792 : swap_compare( comp_type t )
45 : {
46 51792 : switch(t) {
47 : case cmp_equal:
48 : return cmp_equal;
49 : case cmp_lt:
50 : return cmp_gt;
51 : case cmp_lte:
52 : return cmp_gte;
53 : case cmp_gte:
54 : return cmp_lte;
55 : case cmp_gt:
56 : return cmp_lt;
57 : case cmp_notequal:
58 : return cmp_notequal;
59 : default:
60 : return cmp_equal;
61 : }
62 : }
63 :
64 : comp_type
65 7653 : negate_compare( comp_type t )
66 : {
67 7653 : switch(t) {
68 : case cmp_equal:
69 : return cmp_notequal;
70 24 : case cmp_notequal:
71 24 : return cmp_equal;
72 2 : case cmp_lt:
73 2 : return cmp_gte;
74 5 : case cmp_lte:
75 5 : return cmp_gt;
76 2 : case cmp_gte:
77 2 : return cmp_lt;
78 3 : case cmp_gt:
79 3 : return cmp_lte;
80 :
81 0 : case cmp_in:
82 0 : return cmp_notin;
83 0 : case cmp_notin:
84 0 : return cmp_in;
85 :
86 0 : default:
87 0 : return t;
88 : }
89 : }
90 :
91 : comp_type
92 3056 : range2lcompare( int r )
93 : {
94 3056 : if (r&1) {
95 : return cmp_gte;
96 : } else {
97 1155 : return cmp_gt;
98 : }
99 : }
100 :
101 : comp_type
102 3113 : range2rcompare( int r )
103 : {
104 3113 : if (r&2) {
105 : return cmp_lte;
106 : } else {
107 1193 : return cmp_lt;
108 : }
109 : }
110 :
111 : int
112 1872 : compare2range( int l, int r )
113 : {
114 1872 : if (l == cmp_gt) {
115 1772 : if (r == cmp_lt)
116 : return 0;
117 19 : else if (r == cmp_lte)
118 19 : return 2;
119 100 : } else if (l == cmp_gte) {
120 100 : if (r == cmp_lt)
121 : return 1;
122 65 : else if (r == cmp_lte)
123 65 : return 3;
124 : }
125 : return -1;
126 : }
127 :
128 : int
129 107 : compare_funcs2range(const char *l_op, const char *r_op)
130 : {
131 107 : assert(l_op[0] == '>' && r_op[0] == '<');
132 107 : if (!l_op[1] && !r_op[1])
133 : return 0;
134 105 : if (!l_op[1] && r_op[1] == '=')
135 : return 2;
136 105 : if (l_op[1] == '=' && !r_op[1])
137 : return 1;
138 13 : if (l_op[1] == '=' && r_op[1] == '=')
139 : return 3;
140 0 : assert(0);
141 : return 0;
142 : }
143 :
144 : static sql_exp *
145 18172617 : exp_create(allocator *sa, int type)
146 : {
147 18172617 : sql_exp *e = SA_NEW(sa, sql_exp);
148 :
149 18173060 : if (!e)
150 : return NULL;
151 18173060 : *e = (sql_exp) {
152 18173060 : .type = (expression_type) type,
153 : };
154 18173060 : return e;
155 : }
156 :
157 : sql_exp *
158 448004 : exp_compare(allocator *sa, sql_exp *l, sql_exp *r, int cmptype)
159 : {
160 448004 : sql_exp *e = exp_create(sa, e_cmp);
161 448004 : if (e == NULL)
162 : return NULL;
163 448004 : e->card = MAX(l->card,r->card);
164 448004 : e->l = l;
165 448004 : e->r = r;
166 448004 : e->flag = cmptype;
167 448004 : if (!has_nil(l) && !has_nil(r))
168 36130 : set_has_no_nil(e);
169 : return e;
170 : }
171 :
172 : sql_exp *
173 6469 : exp_compare2(allocator *sa, sql_exp *l, sql_exp *r, sql_exp *f, int cmptype, int symmetric)
174 : {
175 6469 : sql_exp *e = exp_create(sa, e_cmp);
176 6469 : if (e == NULL)
177 : return NULL;
178 6469 : assert(f);
179 6469 : e->card = MAX(MAX(l->card,r->card),f->card);
180 6469 : e->l = l;
181 6469 : e->r = r;
182 6469 : e->f = f;
183 6469 : e->flag = cmptype;
184 6469 : if (symmetric)
185 75 : set_symmetric(e);
186 6469 : if (!has_nil(l) && !has_nil(r) && !has_nil(f))
187 507 : set_has_no_nil(e);
188 : return e;
189 : }
190 :
191 : sql_exp *
192 6582 : exp_filter(allocator *sa, list *l, list *r, sql_subfunc *f, int anti)
193 : {
194 6582 : sql_exp *e = exp_create(sa, e_cmp);
195 :
196 6582 : if (e == NULL)
197 : return NULL;
198 6582 : e->card = MAX(exps_card(l),exps_card(r));
199 6582 : if (!r) { /* split l */
200 1372 : list *nl = sa_list(sa), *nr = sa_list(sa);
201 1372 : node *n = l->h;
202 1372 : append(nl, n->data); /* sofar only first is left */
203 3537 : for(n = n->next; n; n = n->next)
204 2165 : append(nr, n->data);
205 : l = nl;
206 : r = nr;
207 : }
208 6582 : e->l = l;
209 6582 : e->r = r;
210 6582 : e->f = f;
211 6582 : e->flag = cmp_filter;
212 6582 : if (anti)
213 793 : set_anti(e);
214 6582 : if (!have_nil(l) && !have_nil(r))
215 3055 : set_has_no_nil(e);
216 : return e;
217 : }
218 :
219 : sql_exp *
220 64667 : exp_or(allocator *sa, list *l, list *r, int anti)
221 : {
222 64667 : sql_exp *e = exp_create(sa, e_cmp);
223 :
224 64667 : if (e == NULL)
225 : return NULL;
226 64667 : e->card = MAX(exps_card(l),exps_card(r));
227 64667 : e->l = l;
228 64667 : e->r = r;
229 64667 : e->flag = cmp_or;
230 64667 : if (anti)
231 0 : set_anti(e);
232 64667 : if (!have_nil(l) && !have_nil(r))
233 2185 : set_has_no_nil(e);
234 : return e;
235 : }
236 :
237 : sql_exp *
238 27646 : exp_in(allocator *sa, sql_exp *l, list *r, int cmptype)
239 : {
240 27646 : sql_exp *e = exp_create(sa, e_cmp);
241 27646 : unsigned int exps_card = CARD_ATOM;
242 :
243 27646 : if (e == NULL)
244 : return NULL;
245 :
246 : /* ignore the cardinalites of sub-relations */
247 139671 : for (node *n = r->h; n ; n = n->next) {
248 112025 : sql_exp *next = n->data;
249 :
250 112025 : if (!exp_is_rel(next) && exps_card < next->card)
251 112025 : exps_card = next->card;
252 : }
253 27646 : e->card = MAX(l->card, exps_card);
254 27646 : e->l = l;
255 27646 : e->r = r;
256 27646 : assert( cmptype == cmp_in || cmptype == cmp_notin);
257 27646 : e->flag = cmptype;
258 27646 : if (!has_nil(l) && !have_nil(r))
259 1758 : set_has_no_nil(e);
260 : return e;
261 : }
262 :
263 : sql_exp *
264 36532 : exp_in_func(mvc *sql, sql_exp *le, sql_exp *vals, int anyequal, int is_tuple)
265 : {
266 36532 : sql_subfunc *a_func = NULL;
267 36532 : sql_exp *e = le;
268 :
269 36532 : if (is_tuple) {
270 5449 : list *l = exp_get_values(e);
271 5449 : e = l->h->data;
272 : }
273 43480 : if (!(a_func = sql_bind_func(sql, "sys", anyequal ? "sql_anyequal" : "sql_not_anyequal", exp_subtype(e), exp_subtype(e), F_FUNC, true, true)))
274 0 : return sql_error(sql, 02, SQLSTATE(42000) "(NOT) IN operator on type %s missing", exp_subtype(e) ? exp_subtype(e)->type->base.name : "unknown");
275 36532 : e = exp_binop(sql->sa, le, vals, a_func);
276 36532 : if (e) {
277 36532 : unsigned int exps_card = CARD_ATOM;
278 :
279 : /* ignore the cardinalites of sub-relations */
280 36532 : if (vals->type == e_atom && vals->f) {
281 161583 : for (node *n = ((list*)vals->f)->h ; n ; n = n->next) {
282 127937 : sql_exp *next = n->data;
283 :
284 127937 : if (!exp_is_rel(next) && exps_card < next->card)
285 127937 : exps_card = next->card;
286 : }
287 2886 : } else if (!exp_is_rel(vals))
288 2886 : exps_card = vals->card;
289 :
290 36532 : e->card = MAX(le->card, exps_card);
291 36532 : if (!has_nil(le) && !has_nil(vals))
292 603 : set_has_no_nil(e);
293 : }
294 : return e;
295 : }
296 :
297 : sql_exp *
298 5418 : exp_in_aggr(mvc *sql, sql_exp *le, sql_exp *vals, int anyequal, int is_tuple)
299 : {
300 5418 : sql_subfunc *a_func = NULL;
301 5418 : sql_exp *e = le;
302 :
303 5418 : if (is_tuple) {
304 0 : list *l = exp_get_values(e);
305 0 : e = l->h->data;
306 : }
307 5427 : if (!(a_func = sql_bind_func(sql, "sys", anyequal ? "anyequal" : "allnotequal", exp_subtype(e), exp_subtype(e), F_AGGR, true, true)))
308 0 : return sql_error(sql, 02, SQLSTATE(42000) "(NOT) IN operator on type %s missing", exp_subtype(e) ? exp_subtype(e)->type->base.name : "unknown");
309 5418 : e = exp_aggr2(sql->sa, le, vals, a_func, need_distinct(e), need_no_nil(e), e->card, has_nil(e));
310 5418 : if (e) {
311 5418 : unsigned int exps_card = CARD_ATOM;
312 :
313 : /* ignore the cardinalites of sub-relations */
314 5418 : if (vals->type == e_atom && vals->f) {
315 30656 : for (node *n = ((list*)vals->f)->h ; n ; n = n->next) {
316 25238 : sql_exp *next = n->data;
317 :
318 25238 : if (!exp_is_rel(next) && exps_card < next->card)
319 25238 : exps_card = next->card;
320 : }
321 0 : } else if (!exp_is_rel(vals))
322 0 : exps_card = vals->card;
323 :
324 5418 : e->card = MAX(le->card, exps_card);
325 5418 : if (!has_nil(le) && !has_nil(vals))
326 0 : set_has_no_nil(e);
327 : }
328 : return e;
329 : }
330 :
331 : sql_exp *
332 119767 : exp_compare_func(mvc *sql, sql_exp *le, sql_exp *re, const char *compareop, int quantifier)
333 : {
334 119767 : sql_subfunc *cmp_func = sql_bind_func(sql, "sys", compareop, exp_subtype(le), exp_subtype(le), F_FUNC, true, true);
335 119767 : sql_exp *e = NULL;
336 :
337 119767 : if (cmp_func == NULL)
338 : return NULL;
339 :
340 119767 : e = exp_binop(sql->sa, le, re, cmp_func);
341 119767 : if (e) {
342 119767 : e->flag = quantifier;
343 : /* At ANY and ALL operators, the cardinality on the right side is ignored if it is a sub-relation */
344 119767 : e->card = quantifier && exp_is_rel(re) ? le->card : MAX(le->card, re->card);
345 119767 : if (!has_nil(le) && !has_nil(re))
346 28151 : set_has_no_nil(e);
347 : }
348 : return e;
349 : }
350 :
351 : static sql_subtype*
352 578703 : dup_subtype(allocator *sa, sql_subtype *st)
353 : {
354 578703 : sql_subtype *res = SA_NEW(sa, sql_subtype);
355 :
356 578703 : if (res == NULL)
357 : return NULL;
358 578703 : *res = *st;
359 578703 : return res;
360 : }
361 :
362 : sql_exp *
363 289352 : exp_convert(allocator *sa, sql_exp *exp, sql_subtype *fromtype, sql_subtype *totype )
364 : {
365 289352 : sql_exp *e = exp_create(sa, e_convert);
366 289351 : if (e == NULL)
367 : return NULL;
368 289351 : e->card = exp->card;
369 289351 : e->l = exp;
370 289351 : totype = dup_subtype(sa, totype);
371 289351 : e->r = append(append(sa_list(sa), dup_subtype(sa, fromtype)),totype);
372 289352 : e->tpe = *totype;
373 289352 : e->alias = exp->alias;
374 289352 : if (!has_nil(exp))
375 81729 : set_has_no_nil(e);
376 : return e;
377 : }
378 :
379 : sql_exp *
380 1074363 : exp_op( allocator *sa, list *l, sql_subfunc *f )
381 : {
382 1074363 : if (f->func->type == F_FILT)
383 1372 : return exp_filter(sa, l, NULL, f, false);
384 1072991 : sql_exp *e = exp_create(sa, e_func);
385 1072991 : if (e == NULL)
386 : return NULL;
387 1072991 : e->card = exps_card(l);
388 1072993 : e->l = l;
389 1072993 : e->f = f;
390 1072993 : e->semantics = f->func->semantics;
391 1072993 : if (!is_semantics(e) && !is_any(e) && l && !have_nil(l))
392 81754 : set_has_no_nil(e);
393 : return e;
394 : }
395 :
396 : sql_exp *
397 18499 : exp_rank_op( allocator *sa, list *l, list *gbe, list *obe, sql_subfunc *f )
398 : {
399 18499 : sql_exp *e = exp_create(sa, e_func);
400 18499 : if (e == NULL)
401 : return NULL;
402 18499 : e->card = list_empty(l)?CARD_MULTI:exps_card(l);
403 18499 : e->l = l;
404 18499 : e->r = append(append(sa_list(sa), gbe), obe);
405 18499 : e->f = f;
406 18499 : if (!f->func->s && strcmp(f->func->base.name, "count") == 0)
407 179 : set_has_no_nil(e);
408 18499 : e->semantics = f->func->semantics;
409 18499 : return e;
410 : }
411 :
412 : sql_exp *
413 59221 : exp_aggr( allocator *sa, list *l, sql_subfunc *a, int distinct, int no_nils, unsigned int card, int has_nils )
414 : {
415 59221 : sql_exp *e = exp_create(sa, e_aggr);
416 59222 : if (e == NULL)
417 : return NULL;
418 59222 : e->card = card;
419 59222 : e->l = l;
420 59222 : e->f = a;
421 59222 : e->semantics = a->func->semantics;
422 59222 : if (distinct)
423 348 : set_distinct(e);
424 59222 : if (no_nils)
425 24369 : set_no_nil(e);
426 59222 : if ((!a->func->semantics && !has_nils) || (!a->func->s && strcmp(a->func->base.name, "count") == 0))
427 23237 : set_has_no_nil(e);
428 : return e;
429 : }
430 :
431 : sql_exp *
432 4522938 : exp_atom(allocator *sa, atom *a)
433 : {
434 4522938 : sql_exp *e = exp_create(sa, e_atom);
435 4522217 : if (e == NULL)
436 : return NULL;
437 4522217 : e->card = CARD_ATOM;
438 4522217 : e->tpe = a->tpe;
439 4522217 : e->l = a;
440 4522217 : if (!a->isnull)
441 4348118 : set_has_no_nil(e);
442 : return e;
443 : }
444 :
445 : sql_exp *
446 0 : exp_atom_max(allocator *sa, sql_subtype *tpe)
447 : {
448 0 : if (tpe->type->localtype == TYPE_bte) {
449 0 : return exp_atom_bte(sa, GDK_bte_max);
450 : } else if (tpe->type->localtype == TYPE_sht) {
451 0 : return exp_atom_sht(sa, GDK_sht_max);
452 : } else if (tpe->type->localtype == TYPE_int) {
453 0 : return exp_atom_int(sa, GDK_int_max);
454 : } else if (tpe->type->localtype == TYPE_lng) {
455 0 : return exp_atom_lng(sa, GDK_lng_max);
456 : #ifdef HAVE_HGE
457 : } else if (tpe->type->localtype == TYPE_hge) {
458 0 : return exp_atom_hge(sa, GDK_hge_max);
459 : #endif
460 : }
461 : return NULL;
462 : }
463 :
464 : sql_exp *
465 131494 : exp_atom_bool(allocator *sa, int b)
466 : {
467 131494 : sql_subtype bt;
468 :
469 131494 : sql_find_subtype(&bt, "boolean", 0, 0);
470 131568 : if (b)
471 83792 : return exp_atom(sa, atom_bool(sa, &bt, TRUE ));
472 : else
473 47776 : return exp_atom(sa, atom_bool(sa, &bt, FALSE ));
474 : }
475 :
476 : sql_exp *
477 0 : exp_atom_bte(allocator *sa, bte i)
478 : {
479 0 : sql_subtype it;
480 :
481 0 : sql_find_subtype(&it, "tinyint", 3, 0);
482 0 : return exp_atom(sa, atom_int(sa, &it, i ));
483 : }
484 :
485 : sql_exp *
486 0 : exp_atom_sht(allocator *sa, sht i)
487 : {
488 0 : sql_subtype it;
489 :
490 0 : sql_find_subtype(&it, "smallint", 5, 0);
491 0 : return exp_atom(sa, atom_int(sa, &it, i ));
492 : }
493 :
494 : sql_exp *
495 832524 : exp_atom_int(allocator *sa, int i)
496 : {
497 832524 : sql_subtype it;
498 :
499 832524 : sql_find_subtype(&it, "int", 9, 0);
500 832753 : return exp_atom(sa, atom_int(sa, &it, i ));
501 : }
502 :
503 : sql_exp *
504 15301 : exp_atom_lng(allocator *sa, lng i)
505 : {
506 15301 : sql_subtype it;
507 :
508 : #ifdef HAVE_HGE
509 15301 : sql_find_subtype(&it, "bigint", 18, 0);
510 : #else
511 : sql_find_subtype(&it, "bigint", 19, 0);
512 : #endif
513 15308 : return exp_atom(sa, atom_int(sa, &it, i ));
514 : }
515 :
516 : sql_exp *
517 16738 : exp_atom_oid(allocator *sa, oid i)
518 : {
519 16738 : sql_subtype it;
520 :
521 : #if SIZEOF_OID == SIZEOF_INT
522 : sql_find_subtype(&it, "oid", 31, 0);
523 : #else
524 16738 : sql_find_subtype(&it, "oid", 63, 0);
525 : #endif
526 16738 : return exp_atom(sa, atom_int(sa, &it, i ));
527 : }
528 :
529 : #ifdef HAVE_HGE
530 : sql_exp *
531 1 : exp_atom_hge(allocator *sa, hge i)
532 : {
533 1 : sql_subtype it;
534 :
535 1 : sql_find_subtype(&it, "hugeint", 39, 0);
536 1 : return exp_atom(sa, atom_int(sa, &it, i ));
537 : }
538 : #endif
539 :
540 : sql_exp *
541 0 : exp_atom_flt(allocator *sa, flt f)
542 : {
543 0 : sql_subtype it;
544 :
545 0 : sql_find_subtype(&it, "real", 24, 0);
546 0 : return exp_atom(sa, atom_float(sa, &it, (dbl)f ));
547 : }
548 :
549 : sql_exp *
550 0 : exp_atom_dbl(allocator *sa, dbl f)
551 : {
552 0 : sql_subtype it;
553 :
554 0 : sql_find_subtype(&it, "double", 53, 0);
555 0 : return exp_atom(sa, atom_float(sa, &it, (dbl)f ));
556 : }
557 :
558 : sql_exp *
559 82516 : exp_atom_str(allocator *sa, const char *s, sql_subtype *st)
560 : {
561 160666 : return exp_atom(sa, atom_string(sa, st, s?sa_strdup(sa, s):NULL));
562 : }
563 :
564 : sql_exp *
565 719315 : exp_atom_clob(allocator *sa, const char *s)
566 : {
567 719315 : sql_subtype clob;
568 :
569 719315 : sql_find_subtype(&clob, "varchar", 0, 0);
570 1437256 : return exp_atom(sa, atom_string(sa, &clob, s?sa_strdup(sa, s):NULL));
571 : }
572 :
573 : sql_exp *
574 261705 : exp_atom_ptr(allocator *sa, void *s)
575 : {
576 261705 : sql_subtype *t = sql_bind_localtype("ptr");
577 261705 : return exp_atom(sa, atom_ptr(sa, t, s));
578 : }
579 :
580 : sql_exp *
581 1664 : exp_atom_ref(allocator *sa, int i, sql_subtype *tpe)
582 : {
583 1664 : sql_exp *e = exp_create(sa, e_atom);
584 1664 : if (e == NULL)
585 : return NULL;
586 1664 : e->card = CARD_ATOM;
587 1664 : e->flag = i;
588 1664 : if (tpe)
589 1664 : e->tpe = *tpe;
590 : return e;
591 : }
592 :
593 : sql_exp *
594 109487 : exp_null(allocator *sa, sql_subtype *tpe)
595 : {
596 109487 : atom *a = atom_general(sa, tpe, NULL, 0);
597 109487 : return exp_atom(sa, a);
598 : }
599 :
600 : sql_exp *
601 2 : exp_zero(allocator *sa, sql_subtype *tpe)
602 : {
603 2 : atom *a = atom_zero_value(sa, tpe);
604 2 : return exp_atom(sa, a);
605 : }
606 :
607 : atom *
608 346 : exp_value(mvc *sql, sql_exp *e)
609 : {
610 346 : if (!e || e->type != e_atom)
611 : return NULL;
612 338 : if (e->l) { /* literal */
613 : return e->l;
614 8 : } else if (e->r) { /* param (ie not set) */
615 8 : sql_var_name *vname = (sql_var_name*) e->r;
616 :
617 8 : assert(e->flag != 0 || vname->sname); /* global variables must have a schema */
618 8 : sql_var *var = e->flag == 0 ? find_global_var(sql, mvc_bind_schema(sql, vname->sname), vname->name) :
619 8 : stack_find_var_at_level(sql, vname->name, e->flag);
620 8 : if (var)
621 0 : return &(var->var);
622 : }
623 : return NULL;
624 : }
625 :
626 : sql_exp *
627 122741 : exp_param_or_declared(allocator *sa, const char *sname, const char *name, sql_subtype *tpe, int frame)
628 : {
629 122741 : sql_var_name *vname;
630 122741 : sql_exp *e = exp_create(sa, e_atom);
631 122741 : if (e == NULL)
632 : return NULL;
633 :
634 122741 : e->r = sa_alloc(sa, sizeof(sql_var_name));
635 122741 : vname = (sql_var_name*) e->r;
636 122741 : vname->sname = sname;
637 122741 : vname->name = name;
638 122741 : e->card = CARD_ATOM;
639 122741 : e->flag = frame;
640 122741 : if (tpe)
641 122741 : e->tpe = *tpe;
642 : return e;
643 : }
644 :
645 : sql_exp *
646 208561 : exp_values(allocator *sa, list *exps)
647 : {
648 208561 : sql_exp *e = exp_create(sa, e_atom);
649 208672 : if (e == NULL)
650 : return NULL;
651 208672 : e->card = exps_card(exps);
652 208762 : e->f = exps;
653 208762 : return e;
654 : }
655 :
656 : list *
657 27297 : exp_get_values(sql_exp *e)
658 : {
659 27297 : if (is_atom(e->type) && e->f)
660 : return e->f;
661 : return NULL;
662 : }
663 :
664 : list *
665 41024 : exp_types(allocator *sa, list *exps)
666 : {
667 41024 : list *l = sa_list(sa);
668 :
669 41024 : if (exps)
670 91920 : for (node *n = exps->h; n; n = n->next)
671 50896 : list_append(l, exp_subtype(n->data));
672 41024 : return l;
673 : }
674 :
675 : int
676 929297 : have_nil(list *exps)
677 : {
678 929297 : int has_nil = 0;
679 :
680 929297 : if (exps)
681 2052099 : for (node *n = exps->h; n && !has_nil; n = n->next) {
682 1122802 : sql_exp *e = n->data;
683 1122802 : has_nil |= has_nil(e);
684 : }
685 929297 : return has_nil;
686 : }
687 :
688 : int
689 213 : have_semantics(list *exps)
690 : {
691 213 : int has_semantics = 0;
692 :
693 213 : if (exps)
694 72 : for (node *n = exps->h; n && !has_semantics; n = n->next) {
695 37 : sql_exp *e = n->data;
696 72 : has_semantics |= is_compare(e->type) && is_semantics(e);
697 : }
698 213 : return has_semantics;
699 : }
700 :
701 : sql_exp *
702 11187030 : exp_column(allocator *sa, const char *rname, const char *cname, sql_subtype *t, unsigned int card, int has_nils, int unique, int intern)
703 : {
704 11187030 : sql_exp *e = exp_create(sa, e_column);
705 :
706 11186997 : if (e == NULL)
707 : return NULL;
708 11186997 : assert(cname);
709 11186997 : e->card = card;
710 11186997 : e->alias.name = cname;
711 11186997 : e->alias.rname = rname;
712 11186997 : e->r = (char*)e->alias.name;
713 11186997 : e->l = (char*)e->alias.rname;
714 11186997 : if (t)
715 11186492 : e->tpe = *t;
716 11186997 : if (!has_nils)
717 2238833 : set_has_no_nil(e);
718 11186997 : if (unique)
719 1563431 : set_unique(e);
720 11186997 : if (intern)
721 817087 : set_intern(e);
722 : return e;
723 : }
724 :
725 : sql_exp *
726 7175768 : exp_propagate(allocator *sa, sql_exp *ne, sql_exp *oe)
727 : {
728 7175768 : if (has_label(oe) &&
729 517291 : (oe->alias.rname == ne->alias.rname || (oe->alias.rname && ne->alias.rname && strcmp(oe->alias.rname, ne->alias.rname) == 0)) &&
730 511146 : (oe->alias.name == ne->alias.name || (oe->alias.name && ne->alias.name && strcmp(oe->alias.name, ne->alias.name) == 0)))
731 511082 : ne->alias.label = oe->alias.label;
732 7175768 : if (is_intern(oe))
733 271731 : set_intern(ne);
734 7175768 : if (is_anti(oe))
735 4282 : set_anti(ne);
736 7175768 : if (is_semantics(oe))
737 567546 : set_semantics(ne);
738 7175768 : if (is_any(oe))
739 22 : set_any(ne);
740 7175768 : if (is_symmetric(oe))
741 13 : set_symmetric(ne);
742 7175768 : if (is_ascending(oe))
743 20299 : set_ascending(ne);
744 7175768 : if (nulls_last(oe))
745 4209 : set_nulls_last(ne);
746 7175768 : if (need_distinct(oe))
747 636 : set_distinct(ne);
748 7175768 : if (zero_if_empty(oe))
749 0 : set_zero_if_empty(ne);
750 7175768 : if (need_no_nil(oe))
751 78985 : set_no_nil(ne);
752 7175768 : if (!has_nil(oe))
753 1668505 : set_has_no_nil(ne);
754 7175768 : if (is_unique(oe))
755 876059 : set_unique(ne);
756 7175768 : if (is_basecol(oe))
757 5829908 : set_basecol(ne);
758 7175768 : ne->p = prop_copy(sa, oe->p);
759 7175768 : return ne;
760 : }
761 :
762 : sql_exp *
763 613529 : exp_ref(mvc *sql, sql_exp *e)
764 : {
765 613529 : if (!exp_name(e))
766 5935 : exp_label(sql->sa, e, ++sql->label);
767 613529 : return exp_propagate(sql->sa, exp_column(sql->sa, exp_relname(e), exp_name(e), exp_subtype(e), exp_card(e), has_nil(e), is_unique(e), is_intern(e)), e);
768 : }
769 :
770 : sql_exp *
771 14200 : exp_ref_save(mvc *sql, sql_exp *e)
772 : {
773 14200 : if (is_atom(e->type))
774 5329 : return exp_copy(sql, e);
775 8871 : if (!exp_name(e) || is_convert(e->type))
776 71 : exp_label(sql->sa, e, ++sql->label);
777 8871 : if (e->type != e_column)
778 5217 : e->ref = 1;
779 8871 : sql_exp *ne = exp_ref(sql, e);
780 8871 : if (ne && is_freevar(e))
781 33 : set_freevar(ne, is_freevar(e)-1);
782 : return ne;
783 : }
784 :
785 : sql_exp *
786 2624249 : exp_alias(allocator *sa, const char *arname, const char *acname, const char *org_rname, const char *org_cname, sql_subtype *t, unsigned int card, int has_nils, int unique, int intern)
787 : {
788 2624249 : sql_exp *e = exp_column(sa, org_rname, org_cname, t, card, has_nils, unique, intern);
789 :
790 2624700 : if (e == NULL)
791 : return NULL;
792 2624700 : assert(acname && org_cname);
793 2624700 : exp_setname(sa, e, (arname)?arname:org_rname, acname);
794 2624700 : return e;
795 : }
796 :
797 : sql_exp *
798 5444934 : exp_alias_or_copy( mvc *sql, const char *tname, const char *cname, sql_rel *orel, sql_exp *old)
799 : {
800 5444934 : sql_exp *ne = NULL;
801 :
802 5444934 : if (!tname)
803 4724230 : tname = exp_relname(old);
804 :
805 5444932 : if (!cname && exp_name(old) && has_label(old)) {
806 0 : ne = exp_column(sql->sa, exp_relname(old), exp_name(old), exp_subtype(old), orel && old->card != CARD_ATOM?orel->card:CARD_ATOM, has_nil(old), is_unique(old), is_intern(old));
807 0 : return exp_propagate(sql->sa, ne, old);
808 5444932 : } else if (!cname) {
809 21820 : exp_label(sql->sa, old, ++sql->label);
810 21820 : ne = exp_column(sql->sa, exp_relname(old), exp_name(old), exp_subtype(old), orel && old->card != CARD_ATOM?orel->card:CARD_ATOM, has_nil(old), is_unique(old), is_intern(old));
811 21820 : return exp_propagate(sql->sa, ne, old);
812 5423112 : } else if (cname && !old->alias.name) {
813 1816 : exp_setname(sql->sa, old, tname, cname);
814 : }
815 5423112 : ne = exp_column(sql->sa, tname, cname, exp_subtype(old), orel && old->card != CARD_ATOM?orel->card:CARD_ATOM, has_nil(old), is_unique(old), is_intern(old));
816 5423122 : return exp_propagate(sql->sa, ne, old);
817 : }
818 :
819 : sql_exp *
820 0 : exp_alias_ref(mvc *sql, sql_exp *e)
821 : {
822 0 : sql_exp *ne = NULL;
823 0 : const char *tname = exp_relname(e);
824 0 : const char *cname = exp_name(e);
825 :
826 0 : if (!has_label(e))
827 0 : exp_label(sql->sa, e, ++sql->label);
828 0 : ne = exp_ref(sql, e);
829 0 : exp_setname(sql->sa, ne, tname, cname);
830 0 : return exp_propagate(sql->sa, ne, e);
831 : }
832 :
833 : sql_exp *
834 15905 : exp_set(allocator *sa, const char *sname, const char *name, sql_exp *val, int level)
835 : {
836 15905 : sql_exp *e = exp_create(sa, e_psm);
837 :
838 15905 : if (e == NULL)
839 : return NULL;
840 15905 : e->alias.rname = sname;
841 15905 : e->alias.name = name;
842 15905 : e->l = val;
843 15905 : e->flag = PSM_SET + SET_PSM_LEVEL(level);
844 15905 : return e;
845 : }
846 :
847 : sql_exp *
848 9376 : exp_var(allocator *sa, const char *sname, const char *name, sql_subtype *type, int level)
849 : {
850 9376 : sql_exp *e = exp_create(sa, e_psm);
851 :
852 9376 : if (e == NULL)
853 : return NULL;
854 9376 : e->alias.rname = sname;
855 9376 : e->alias.name = name;
856 9376 : e->tpe = *type;
857 9376 : e->flag = PSM_VAR + SET_PSM_LEVEL(level);
858 9376 : return e;
859 : }
860 :
861 : sql_exp *
862 117 : exp_table(allocator *sa, const char *name, sql_table *t, int level)
863 : {
864 117 : sql_exp *e = exp_create(sa, e_psm);
865 :
866 117 : if (e == NULL)
867 : return NULL;
868 117 : e->alias.rname = NULL;
869 117 : e->alias.name = name;
870 117 : e->f = t;
871 117 : e->flag = PSM_VAR + SET_PSM_LEVEL(level);
872 117 : return e;
873 : }
874 :
875 : sql_exp *
876 22936 : exp_return(allocator *sa, sql_exp *val, int level)
877 : {
878 22936 : sql_exp *e = exp_create(sa, e_psm);
879 :
880 22937 : if (e == NULL)
881 : return NULL;
882 22937 : e->l = val;
883 22937 : e->flag = PSM_RETURN + SET_PSM_LEVEL(level);
884 22937 : return e;
885 : }
886 :
887 : sql_exp *
888 1000 : exp_while(allocator *sa, sql_exp *cond, list *stmts)
889 : {
890 1000 : sql_exp *e = exp_create(sa, e_psm);
891 :
892 1000 : if (e == NULL)
893 : return NULL;
894 1000 : e->l = cond;
895 1000 : e->r = stmts;
896 1000 : e->flag = PSM_WHILE;
897 1000 : return e;
898 : }
899 :
900 : sql_exp *
901 11433 : exp_if(allocator *sa, sql_exp *cond, list *if_stmts, list *else_stmts)
902 : {
903 11433 : sql_exp *e = exp_create(sa, e_psm);
904 :
905 11433 : if (e == NULL)
906 : return NULL;
907 11433 : e->l = cond;
908 11433 : e->r = if_stmts;
909 11433 : e->f = else_stmts;
910 11433 : e->flag = PSM_IF;
911 11433 : return e;
912 : }
913 :
914 : sql_exp *
915 77681 : exp_rel(mvc *sql, sql_rel *rel)
916 : {
917 77681 : sql_exp *e = exp_create(sql->sa, e_psm);
918 :
919 77681 : if (e == NULL)
920 : return NULL;
921 77681 : e->l = rel;
922 77681 : e->flag = PSM_REL;
923 77681 : e->card = is_single(rel)?CARD_ATOM:rel->card;
924 77681 : assert(rel);
925 77681 : if (is_topn(rel->op))
926 3 : rel = rel->l;
927 77681 : if (is_project(rel->op)) {
928 58933 : sql_exp *last = rel->exps->t->data;
929 58933 : sql_subtype *t = exp_subtype(last);
930 58934 : e->tpe = t ? *t : (sql_subtype) {0};
931 : }
932 : return e;
933 : }
934 :
935 : sql_exp *
936 157 : exp_exception(allocator *sa, sql_exp *cond, const char *error_message)
937 : {
938 157 : sql_exp *e = exp_create(sa, e_psm);
939 :
940 157 : if (e == NULL)
941 : return NULL;
942 157 : e->l = cond;
943 157 : e->r = sa_strdup(sa, error_message);
944 157 : e->flag = PSM_EXCEPTION;
945 157 : return e;
946 : }
947 :
948 : /* Set a name (alias) for the expression, such that we can refer
949 : to this expression by this simple name.
950 : */
951 : void
952 3786525 : exp_setname(allocator *sa, sql_exp *e, const char *rname, const char *name )
953 : {
954 3786525 : (void)sa;
955 3786525 : e->alias.label = 0;
956 3786525 : if (name)
957 3625315 : e->alias.name = name;
958 3786525 : e->alias.rname = (rname);
959 3786525 : }
960 :
961 : void
962 158165 : noninternexp_setname(allocator *sa, sql_exp *e, const char *rname, const char *name )
963 : {
964 158165 : if (!is_intern(e))
965 158164 : exp_setname(sa, e, rname, name);
966 158165 : }
967 :
968 : void
969 119551 : exp_setalias(sql_exp *e, const char *rname, const char *name )
970 : {
971 119551 : e->alias.label = 0;
972 119551 : e->alias.name = name;
973 119551 : e->alias.rname = rname;
974 119551 : }
975 :
976 : void
977 675448 : exp_prop_alias(allocator *sa, sql_exp *e, sql_exp *oe )
978 : {
979 675448 : e->ref = oe->ref;
980 675448 : if (oe->alias.name == NULL && exp_has_rel(oe)) {
981 7915 : sql_rel *r = exp_rel_get_rel(sa, oe);
982 7915 : if (!is_project(r->op))
983 : return ;
984 7915 : oe = r->exps->t->data;
985 : }
986 675448 : e->alias = oe->alias;
987 : }
988 :
989 : str
990 3445013 : number2name(str s, int len, int i)
991 : {
992 3445013 : s[--len] = 0;
993 9517277 : while(i>0) {
994 6072264 : s[--len] = '0' + (i & 7);
995 6072264 : i >>= 3;
996 : }
997 3445013 : s[--len] = '%';
998 3445013 : return s + len;
999 : }
1000 :
1001 : void
1002 1623490 : exp_setrelname(allocator *sa, sql_exp *e, int nr)
1003 : {
1004 1623490 : char name[16], *nme;
1005 :
1006 1623490 : nme = number2name(name, sizeof(name), nr);
1007 1623490 : e->alias.label = 0;
1008 1623490 : e->alias.rname = sa_strdup(sa, nme);
1009 1623490 : }
1010 :
1011 : char *
1012 1764907 : make_label(allocator *sa, int nr)
1013 : {
1014 1764907 : char name[16], *nme;
1015 :
1016 1764907 : nme = number2name(name, sizeof(name), nr);
1017 1765348 : return sa_strdup(sa, nme);
1018 : }
1019 :
1020 : sql_exp*
1021 1755606 : exp_label(allocator *sa, sql_exp *e, int nr)
1022 : {
1023 1755606 : assert(nr > 0);
1024 1755606 : e->alias.label = nr;
1025 1755606 : e->alias.rname = e->alias.name = make_label(sa, nr);
1026 1756027 : return e;
1027 : }
1028 :
1029 : list*
1030 4209 : exps_label(allocator *sa, list *exps, int nr)
1031 : {
1032 4209 : if (!exps)
1033 : return NULL;
1034 11423 : for (node *n = exps->h; n; n = n->next)
1035 7214 : n->data = exp_label(sa, n->data, nr++);
1036 4209 : list_hash_clear(exps);
1037 4209 : return exps;
1038 : }
1039 :
1040 : void
1041 20454 : exp_swap( sql_exp *e )
1042 : {
1043 20454 : sql_exp *s = e->l;
1044 :
1045 20454 : e->l = e->r;
1046 20454 : e->r = s;
1047 20454 : e->flag = swap_compare((comp_type)e->flag);
1048 20454 : assert(!e->f);
1049 20454 : }
1050 :
1051 : sql_subtype *
1052 31174972 : exp_subtype( sql_exp *e )
1053 : {
1054 31175012 : switch(e->type) {
1055 7774631 : case e_atom: {
1056 7774631 : if (e->l) {
1057 7053873 : atom *a = e->l;
1058 7053873 : return atom_type(a);
1059 720758 : } else if (e->tpe.type) { /* atom reference */
1060 718914 : return &e->tpe;
1061 1844 : } else if (e->f) {
1062 40 : list *vals = exp_get_values(e);
1063 40 : if (!list_empty(vals))
1064 40 : return exp_subtype(vals->h->data);
1065 : }
1066 : break;
1067 : }
1068 18725707 : case e_convert:
1069 : case e_column:
1070 18725707 : if (e->tpe.type)
1071 18725593 : return &e->tpe;
1072 : break;
1073 4540927 : case e_aggr:
1074 : case e_func: {
1075 4540927 : if (e->f) {
1076 4540927 : sql_subfunc *f = e->f;
1077 4540927 : if (f->res && list_length(f->res) == 1)
1078 4530712 : return f->res->h->data;
1079 : }
1080 : return NULL;
1081 : }
1082 7269 : case e_cmp:
1083 7269 : return sql_bind_localtype("bit");
1084 126478 : case e_psm:
1085 126478 : if (e->tpe.type)
1086 126463 : return &e->tpe;
1087 : /* fall through */
1088 : default:
1089 : return NULL;
1090 : }
1091 : return NULL;
1092 : }
1093 :
1094 : const char *
1095 34065212 : exp_name( sql_exp *e )
1096 : {
1097 34081360 : if (e->alias.name)
1098 : return e->alias.name;
1099 1410018 : if (e->type == e_convert && e->l)
1100 : return exp_name(e->l);
1101 1405147 : if (e->type == e_psm && e->l) { /* subquery return name of last expression */
1102 11277 : sql_rel *r = e->l;
1103 11277 : if (is_project(r->op))
1104 11277 : return exp_name(r->exps->t->data);
1105 : }
1106 : return NULL;
1107 : }
1108 :
1109 : const char *
1110 14069486 : exp_relname( sql_exp *e )
1111 : {
1112 14071605 : if (e->alias.rname)
1113 : return e->alias.rname;
1114 598913 : if (!e->alias.name && e->type == e_convert && e->l)
1115 : return exp_relname(e->l);
1116 597954 : if (!e->alias.name && e->type == e_psm && e->l) { /* subquery return name of last expression */
1117 1160 : sql_rel *r = e->l;
1118 1160 : if (is_project(r->op))
1119 1160 : return exp_relname(r->exps->t->data);
1120 : }
1121 : return NULL;
1122 : }
1123 :
1124 : const char *
1125 15598 : exp_find_rel_name(sql_exp *e)
1126 : {
1127 15598 : if (e->alias.rname)
1128 : return e->alias.rname;
1129 261 : switch(e->type) {
1130 : case e_column:
1131 : break;
1132 0 : case e_convert:
1133 0 : return exp_find_rel_name(e->l);
1134 : default:
1135 : return NULL;
1136 : }
1137 : return NULL;
1138 : }
1139 :
1140 : unsigned int
1141 2405577 : exp_card( sql_exp *e )
1142 : {
1143 2405577 : return e->card;
1144 : }
1145 :
1146 : const char *
1147 0 : exp_func_name( sql_exp *e )
1148 : {
1149 0 : if (e->type == e_func && e->f) {
1150 0 : sql_subfunc *f = e->f;
1151 0 : return f->func->base.name;
1152 : }
1153 0 : if (e->alias.name)
1154 : return e->alias.name;
1155 0 : if (e->type == e_convert && e->l)
1156 0 : return exp_name(e->l);
1157 : return NULL;
1158 : }
1159 :
1160 : int
1161 47935419 : exp_cmp( sql_exp *e1, sql_exp *e2)
1162 : {
1163 47935419 : return (e1 == e2)?0:-1;
1164 : }
1165 :
1166 : int
1167 224700 : exp_equal( sql_exp *e1, sql_exp *e2)
1168 : {
1169 224700 : if (e1 == e2)
1170 : return 0;
1171 224700 : if (e1->alias.rname && e2->alias.rname && strcmp(e1->alias.rname, e2->alias.rname) == 0)
1172 168570 : return strcmp(e1->alias.name, e2->alias.name);
1173 56130 : if (!e1->alias.rname && !e2->alias.rname && e1->alias.label == e2->alias.label && e1->alias.name && e2->alias.name)
1174 536 : return strcmp(e1->alias.name, e2->alias.name);
1175 : return -1;
1176 : }
1177 :
1178 : int
1179 47935321 : exp_match( sql_exp *e1, sql_exp *e2)
1180 : {
1181 47935321 : if (exp_cmp(e1, e2) == 0)
1182 : return 1;
1183 47684823 : if (e1->type == e2->type && e1->type == e_column) {
1184 23164773 : if (e1->l != e2->l && (!e1->l || !e2->l || strcmp(e1->l, e2->l) != 0))
1185 : return 0;
1186 13573755 : if (!e1->r || !e2->r || strcmp(e1->r, e2->r) != 0)
1187 : return 0;
1188 : return 1;
1189 : }
1190 24520050 : if (e1->type == e2->type && e1->type == e_func) {
1191 8778352 : if (is_identity(e1, NULL) && is_identity(e2, NULL)) {
1192 0 : list *args1 = e1->l;
1193 0 : list *args2 = e2->l;
1194 :
1195 0 : if (list_length(args1) == list_length(args2) && list_length(args1) == 1) {
1196 0 : sql_exp *ne1 = args1->h->data;
1197 0 : sql_exp *ne2 = args2->h->data;
1198 :
1199 0 : if (exp_match(ne1,ne2))
1200 : return 1;
1201 : }
1202 : }
1203 : }
1204 : return 0;
1205 : }
1206 :
1207 : /* list already contains matching expression */
1208 : sql_exp*
1209 419561 : exps_find_exp( list *l, sql_exp *e)
1210 : {
1211 419561 : node *n;
1212 :
1213 419561 : if (!l || !l->h)
1214 : return NULL;
1215 :
1216 1014100 : for(n=l->h; n; n = n->next) {
1217 945898 : if (exp_match(n->data, e) || exp_refers(n->data, e))
1218 338572 : return n->data;
1219 : }
1220 : return NULL;
1221 : }
1222 :
1223 :
1224 : /* c refers to the parent p */
1225 : int
1226 3995398 : exp_refers( sql_exp *p, sql_exp *c)
1227 : {
1228 3995398 : if (c->type == e_column) {
1229 : // at first they need to have the same expression names
1230 850108 : if (!p->alias.name || !c->r || strcmp(p->alias.name, c->r) != 0)
1231 : return 0;
1232 74580 : if (!c->l)
1233 : return 1;
1234 : // then compare the relation names
1235 64167 : if (c->l && (p->alias.rname || p->l)) {
1236 : // if the parent has an alias for the relation name compare with the child's relation name
1237 64166 : if (p->alias.rname && strcmp(p->alias.rname, c->l) != 0)
1238 : return 0;
1239 : // if the parent does NOT have a relation name alias compare his relation name with the child's
1240 44869 : if (!p->alias.rname && p->l && (strcmp(p->l, c->l) != 0 || strcmp(p->alias.name, p->r) !=0))
1241 : return 0;
1242 44860 : return 1;
1243 : }
1244 : }
1245 : return 0;
1246 : }
1247 :
1248 : int
1249 0 : exp_match_col_exps( sql_exp *e, list *l)
1250 : {
1251 0 : node *n;
1252 :
1253 0 : for(n=l->h; n; n = n->next) {
1254 0 : sql_exp *re = n->data;
1255 0 : sql_exp *re_r = re->r;
1256 :
1257 0 : if (re->type == e_cmp && re->flag == cmp_or)
1258 0 : return exp_match_col_exps(e, re->l) &&
1259 0 : exp_match_col_exps(e, re->r);
1260 :
1261 0 : if (re->type != e_cmp || !re_r || re_r->card != 1 || !exp_match_exp(e, re->l))
1262 0 : return 0;
1263 : }
1264 : return 1;
1265 : }
1266 :
1267 : int
1268 10543 : exps_match_col_exps( sql_exp *e1, sql_exp *e2)
1269 : {
1270 10543 : sql_exp *e1_r = e1->r;
1271 10543 : sql_exp *e2_r = e2->r;
1272 :
1273 10543 : if (e1->type != e_cmp || e2->type != e_cmp)
1274 : return 0;
1275 :
1276 10483 : if (!is_complex_exp(e1->flag) && e1_r && e1_r->card == CARD_ATOM &&
1277 5969 : !is_complex_exp(e2->flag) && e2_r && e2_r->card == CARD_ATOM)
1278 5043 : return exp_match_exp(e1->l, e2->l);
1279 :
1280 5440 : if (!is_complex_exp(e1->flag) && e1_r && e1_r->card == CARD_ATOM &&
1281 926 : (e2->flag == cmp_in || e2->flag == cmp_notin))
1282 844 : return exp_match_exp(e1->l, e2->l);
1283 4596 : if ((e1->flag == cmp_in || e1->flag == cmp_notin) &&
1284 2110 : !is_complex_exp(e2->flag) && e2_r && e2_r->card == CARD_ATOM)
1285 1583 : return exp_match_exp(e1->l, e2->l);
1286 :
1287 3013 : if ((e1->flag == cmp_in || e1->flag == cmp_notin) &&
1288 527 : (e2->flag == cmp_in || e2->flag == cmp_notin))
1289 527 : return exp_match_exp(e1->l, e2->l);
1290 :
1291 2486 : if (!is_complex_exp(e1->flag) && e1_r && e1_r->card == CARD_ATOM &&
1292 82 : e2->flag == cmp_or)
1293 0 : return exp_match_col_exps(e1->l, e2->l) &&
1294 0 : exp_match_col_exps(e1->l, e2->r);
1295 :
1296 2486 : if (e1->flag == cmp_or &&
1297 0 : !is_complex_exp(e2->flag) && e2_r && e2_r->card == CARD_ATOM)
1298 0 : return exp_match_col_exps(e2->l, e1->l) &&
1299 0 : exp_match_col_exps(e2->l, e1->r);
1300 :
1301 2486 : if (e1->flag == cmp_or && e2->flag == cmp_or) {
1302 0 : list *l = e1->l, *r = e1->r;
1303 0 : sql_exp *el = l->h->data;
1304 0 : sql_exp *er = r->h->data;
1305 :
1306 0 : return list_length(l) == 1 && list_length(r) == 1 &&
1307 0 : exps_match_col_exps(el, e2) &&
1308 0 : exps_match_col_exps(er, e2);
1309 : }
1310 : return 0;
1311 : }
1312 :
1313 : int
1314 47756 : exp_match_list( list *l, list *r)
1315 : {
1316 47756 : node *n, *m;
1317 47756 : char *lu, *ru;
1318 47756 : int lc = 0, rc = 0, match = 0;
1319 :
1320 47756 : if (!l || !r)
1321 11 : return l == r;
1322 47745 : if (list_length(l) != list_length(r) || list_length(l) == 0 || list_length(r) == 0)
1323 587 : return 0;
1324 47158 : if (list_length(l) > 10 || list_length(r) > 10)
1325 5 : return 0;/* to expensive */
1326 :
1327 47153 : lu = ZNEW_ARRAY(char, list_length(l));
1328 47153 : ru = ZNEW_ARRAY(char, list_length(r));
1329 47153 : if (!lu || !ru) {
1330 0 : _DELETE(lu);
1331 0 : _DELETE(ru);
1332 0 : return 0;
1333 : }
1334 138417 : for (n = l->h, lc = 0; n; n = n->next, lc++) {
1335 91264 : sql_exp *le = n->data;
1336 :
1337 271716 : for ( m = r->h, rc = 0; m; m = m->next, rc++) {
1338 180452 : sql_exp *re = m->data;
1339 :
1340 180452 : if (!ru[rc] && exp_match_exp(le,re)) {
1341 6791 : lu[lc] = 1;
1342 6791 : ru[rc] = 1;
1343 6791 : match = 1;
1344 : }
1345 : }
1346 : }
1347 54405 : for (n = l->h, lc = 0; n && match; n = n->next, lc++)
1348 7252 : if (!lu[lc])
1349 1378 : match = 0;
1350 52535 : for (n = r->h, rc = 0; n && match; n = n->next, rc++)
1351 5382 : if (!ru[rc])
1352 0 : match = 0;
1353 47153 : _DELETE(lu);
1354 47153 : _DELETE(ru);
1355 47153 : return match;
1356 : }
1357 :
1358 : static int
1359 2417634 : exps_equal( list *l, list *r)
1360 : {
1361 2417634 : node *n, *m;
1362 :
1363 2417634 : if (!l || !r)
1364 50805 : return l == r;
1365 2366829 : if (list_length(l) != list_length(r))
1366 : return 0;
1367 3475683 : for (n = l->h, m = r->h; n && m; n = n->next, m = m->next) {
1368 3428483 : sql_exp *le = n->data, *re = m->data;
1369 :
1370 3428483 : if (!exp_match_exp(le,re))
1371 : return 0;
1372 : }
1373 : return 1;
1374 : }
1375 :
1376 : int
1377 43685600 : exp_match_exp_semantics( sql_exp *e1, sql_exp *e2, bool semantics)
1378 : {
1379 43685600 : if (exp_match(e1, e2))
1380 : return 1;
1381 42490363 : if (is_ascending(e1) != is_ascending(e2) || nulls_last(e1) != nulls_last(e2) || zero_if_empty(e1) != zero_if_empty(e2) ||
1382 42490359 : need_no_nil(e1) != need_no_nil(e2) || is_anti(e1) != is_anti(e2) || (semantics && is_semantics(e1) != is_semantics(e2)) ||
1383 30807462 : (semantics && is_any(e1) != is_any(e2)) ||
1384 31130259 : is_symmetric(e1) != is_symmetric(e2) || is_unique(e1) != is_unique(e2) || need_distinct(e1) != need_distinct(e2))
1385 : return 0;
1386 30503453 : if (e1->type == e2->type) {
1387 22475951 : switch(e1->type) {
1388 380767 : case e_cmp:
1389 632197 : if (e1->flag == e2->flag && !is_complex_exp(e1->flag) &&
1390 255677 : exp_match_exp(e1->l, e2->l) && exp_match_exp(e1->r, e2->r) &&
1391 939 : ((!e1->f && !e2->f) || (e1->f && e2->f && exp_match_exp(e1->f, e2->f))))
1392 936 : return 1;
1393 383267 : else if (e1->flag == e2->flag && e1->flag == cmp_or &&
1394 3448 : exp_match_list(e1->l, e2->l) && exp_match_list(e1->r, e2->r))
1395 : return 1;
1396 379826 : else if (e1->flag == e2->flag &&
1397 259908 : (e1->flag == cmp_in || e1->flag == cmp_notin) &&
1398 2947 : exp_match_exp(e1->l, e2->l) && exp_match_list(e1->r, e2->r))
1399 : return 1;
1400 627183 : else if (e1->flag == e2->flag && (e1->flag == cmp_equal || e1->flag == cmp_notequal) &&
1401 247395 : exp_match_exp(e1->l, e2->r) && exp_match_exp(e1->r, e2->l))
1402 : return 1; /* = and <> operations are reflective, so exp_match_exp can be called crossed */
1403 : break;
1404 277088 : case e_convert:
1405 342859 : if (!subtype_cmp(exp_totype(e1), exp_totype(e2)) &&
1406 94220 : !subtype_cmp(exp_fromtype(e1), exp_fromtype(e2)) &&
1407 28449 : exp_match_exp(e1->l, e2->l))
1408 : return 1;
1409 : break;
1410 58633 : case e_aggr:
1411 93608 : if (!subfunc_cmp(e1->f, e2->f) && /* equal aggregation*/
1412 34975 : exps_equal(e1->l, e2->l))
1413 : return 1;
1414 : break;
1415 4449712 : case e_func: {
1416 4449712 : sql_subfunc *e1f = (sql_subfunc*) e1->f;
1417 4449712 : const char *sname = e1f->func->s ? e1f->func->s->base.name : NULL;
1418 4449712 : int (*comp)(list*, list*) = is_commutative(sname, e1f->func->base.name) ? exp_match_list : exps_equal;
1419 :
1420 8899424 : if (!e1f->func->side_effect &&
1421 6821576 : !subfunc_cmp(e1f, e2->f) && /* equal functions */
1422 2421441 : comp(e1->l, e2->l) &&
1423 : /* optional order by expressions */
1424 49577 : exps_equal(e1->r, e2->r))
1425 : return 1;
1426 : } break;
1427 1068309 : case e_atom:
1428 1068309 : if (e1->l && e2->l && !atom_cmp(e1->l, e2->l))
1429 : return 1;
1430 1036991 : if (e1->f && e2->f && exps_equal(e1->f, e2->f))
1431 : return 1;
1432 1036963 : if (e1->r && e2->r && e1->flag == e2->flag && !subtype_cmp(&e1->tpe, &e2->tpe)) {
1433 0 : sql_var_name *v1 = (sql_var_name*) e1->r, *v2 = (sql_var_name*) e2->r;
1434 0 : if (((!v1->sname && !v2->sname) || (v1->sname && v2->sname && strcmp(v1->sname, v2->sname) == 0)) &&
1435 0 : ((!v1->name && !v2->name) || (v1->name && v2->name && strcmp(v1->name, v2->name) == 0)))
1436 : return 1;
1437 : }
1438 1036963 : if (!e1->l && !e1->r && !e1->f && !e2->l && !e2->r && !e2->f && e1->flag == e2->flag && !subtype_cmp(&e1->tpe, &e2->tpe))
1439 : return 1;
1440 : break;
1441 : default:
1442 : break;
1443 : }
1444 : }
1445 : return 0;
1446 : }
1447 :
1448 : int
1449 43359807 : exp_match_exp( sql_exp *e1, sql_exp *e2)
1450 : {
1451 43359807 : return exp_match_exp_semantics( e1, e2, true);
1452 : }
1453 :
1454 : sql_exp *
1455 141585 : exps_any_match(list *l, sql_exp *e)
1456 : {
1457 141585 : if (!l)
1458 : return NULL;
1459 552543 : for (node *n = l->h; n ; n = n->next) {
1460 500249 : sql_exp *ne = (sql_exp *) n->data;
1461 500249 : if (exp_match_exp(ne, e))
1462 89291 : return ne;
1463 : }
1464 : return NULL;
1465 : }
1466 :
1467 : static int
1468 24 : exps_are_joins( list *l )
1469 : {
1470 24 : if (l)
1471 52 : for (node *n = l->h; n; n = n->next) {
1472 28 : sql_exp *e = n->data;
1473 :
1474 28 : if (exp_is_join_exp(e))
1475 : return -1;
1476 : }
1477 : return 0;
1478 : }
1479 :
1480 : int
1481 257 : exp_is_join_exp(sql_exp *e)
1482 : {
1483 257 : if (exp_is_join(e, NULL) == 0)
1484 : return 0;
1485 25 : if (e->type == e_cmp && e->flag == cmp_or && e->card >= CARD_AGGR)
1486 12 : if (exps_are_joins(e->l) == 0 && exps_are_joins(e->r) == 0)
1487 : return 0;
1488 : return -1;
1489 : }
1490 :
1491 : static int
1492 700299 : exp_is_complex_select( sql_exp *e )
1493 : {
1494 716628 : switch (e->type) {
1495 483 : case e_atom: {
1496 483 : if (e->f) {
1497 0 : int r = (e->card == CARD_ATOM);
1498 0 : list *l = e->f;
1499 :
1500 0 : if (r)
1501 0 : for (node *n = l->h; n && !r; n = n->next)
1502 0 : r |= exp_is_complex_select(n->data);
1503 0 : return r;
1504 : }
1505 : return 0;
1506 : }
1507 16329 : case e_convert:
1508 16329 : return exp_is_complex_select(e->l);
1509 2048 : case e_func:
1510 : case e_aggr:
1511 : {
1512 2048 : int r = (e->card == CARD_ATOM);
1513 2048 : list *l = e->l;
1514 :
1515 2048 : if (r && l)
1516 17 : for (node *n = l->h; n && !r; n = n->next)
1517 0 : r |= exp_is_complex_select(n->data);
1518 : return r;
1519 : }
1520 : case e_psm:
1521 : return 1;
1522 : case e_column:
1523 : case e_cmp:
1524 : default:
1525 : return 0;
1526 : }
1527 : }
1528 :
1529 : static int
1530 350154 : complex_select(sql_exp *e)
1531 : {
1532 350154 : sql_exp *l = e->l, *r = e->r;
1533 :
1534 350154 : if (exp_is_complex_select(l) || exp_is_complex_select(r))
1535 17 : return 1;
1536 : return 0;
1537 : }
1538 :
1539 : static int
1540 843 : distinct_rel(sql_exp *e, const char **rname)
1541 : {
1542 965 : const char *e_rname = NULL;
1543 :
1544 965 : switch(e->type) {
1545 571 : case e_column:
1546 571 : e_rname = exp_relname(e);
1547 :
1548 571 : if (*rname && e_rname && strcmp(*rname, e_rname) == 0)
1549 : return 1;
1550 461 : if (!*rname) {
1551 283 : *rname = e_rname;
1552 283 : return 1;
1553 : }
1554 : break;
1555 139 : case e_aggr:
1556 : case e_func:
1557 139 : if (e->l) {
1558 139 : int m = 1;
1559 139 : list *l = e->l;
1560 139 : node *n;
1561 :
1562 422 : for(n=l->h; n && m; n = n->next) {
1563 283 : sql_exp *ae = n->data;
1564 :
1565 283 : m = distinct_rel(ae, rname);
1566 : }
1567 139 : return m;
1568 : }
1569 : return 0;
1570 : case e_atom:
1571 : return 1;
1572 122 : case e_convert:
1573 122 : return distinct_rel(e->l, rname);
1574 : default:
1575 : return 0;
1576 : }
1577 : return 0;
1578 : }
1579 :
1580 : int
1581 19934587 : rel_has_exp(sql_rel *rel, sql_exp *e, bool subexp)
1582 : {
1583 19934587 : if (rel_find_exp_and_corresponding_rel(rel, e, subexp, NULL, NULL))
1584 4075315 : return 0;
1585 : return -1;
1586 : }
1587 :
1588 : int
1589 0 : rel_has_exps(sql_rel *rel, list *exps, bool subexp)
1590 : {
1591 0 : if (list_empty(exps))
1592 : return 0;
1593 0 : for (node *n = exps->h; n; n = n->next)
1594 0 : if (rel_has_exp(rel, n->data, subexp) >= 0)
1595 : return 0;
1596 : return -1;
1597 : }
1598 :
1599 : int
1600 4790 : rel_has_all_exps(sql_rel *rel, list *exps)
1601 : {
1602 4790 : if (list_empty(exps))
1603 : return 1;
1604 9784 : for (node *n = exps->h; n; n = n->next)
1605 9579 : if (rel_has_exp(rel, n->data, false) < 0)
1606 : return 0;
1607 : return 1;
1608 : }
1609 :
1610 : static int
1611 15402553 : rel_has_exp2(sql_rel *rel, sql_exp *e)
1612 : {
1613 15402553 : return rel_has_exp(rel, e, false);
1614 : }
1615 :
1616 : sql_rel *
1617 5761502 : find_rel(list *rels, sql_exp *e)
1618 : {
1619 5761502 : node *n = list_find(rels, e, (fcmp)&rel_has_exp2);
1620 5761502 : if (n)
1621 3188471 : return n->data;
1622 : return NULL;
1623 : }
1624 :
1625 : sql_rel *
1626 0 : find_one_rel(list *rels, sql_exp *e)
1627 : {
1628 0 : node *n;
1629 0 : sql_rel *fnd = NULL;
1630 :
1631 0 : for(n = rels->h; n; n = n->next) {
1632 0 : if (rel_has_exp(n->data, e, false) == 0) {
1633 0 : if (fnd)
1634 : return NULL;
1635 0 : fnd = n->data;
1636 : }
1637 : }
1638 : return fnd;
1639 : }
1640 :
1641 : static int
1642 288 : exp_is_rangejoin(sql_exp *e, list *rels)
1643 : {
1644 : /* assume e is a e_cmp with 3 args
1645 : * Need to check e->r and e->f only touch one table.
1646 : */
1647 288 : const char *rname = 0;
1648 :
1649 288 : if (distinct_rel(e->r, &rname) && distinct_rel(e->f, &rname))
1650 : return 0;
1651 178 : if (rels) {
1652 128 : sql_rel *r = find_rel(rels, e->r);
1653 128 : sql_rel *f = find_rel(rels, e->f);
1654 128 : if (r && f && r == f)
1655 : return 0;
1656 : }
1657 : return -1;
1658 : }
1659 :
1660 : int
1661 351717 : exp_is_join(sql_exp *e, list *rels)
1662 : {
1663 : /* only simple compare expressions, ie not or lists
1664 : or range expressions (e->f)
1665 : */
1666 351717 : if (e->type == e_cmp && !is_complex_exp(e->flag) && e->l && e->r && !e->f && e->card >= CARD_AGGR && !complex_select(e))
1667 : return 0;
1668 1868 : if (e->type == e_cmp && e->flag == cmp_filter && e->l && e->r && e->card >= CARD_AGGR)
1669 : return 0;
1670 : /* range expression */
1671 1719 : if (e->type == e_cmp && !is_complex_exp(e->flag) && e->l && e->r && e->f && e->card >= CARD_AGGR && !complex_select(e))
1672 288 : return exp_is_rangejoin(e, rels);
1673 : return -1;
1674 : }
1675 :
1676 : int
1677 345965 : exp_is_eqjoin(sql_exp *e)
1678 : {
1679 345965 : if (e->flag == cmp_equal) {
1680 336230 : sql_exp *l = e->l;
1681 336230 : sql_exp *r = e->r;
1682 :
1683 336230 : if (!is_func(l->type) && !is_func(r->type))
1684 335128 : return 0;
1685 : }
1686 : return -1;
1687 : }
1688 :
1689 : sql_exp *
1690 231026 : exps_find_prop(list *exps, rel_prop kind)
1691 : {
1692 231026 : if (list_empty(exps))
1693 : return NULL;
1694 460765 : for (node *n = exps->h ; n ; n = n->next) {
1695 231026 : sql_exp *e = n->data;
1696 :
1697 231026 : if (find_prop(e->p, kind))
1698 1287 : return e;
1699 : }
1700 : return NULL;
1701 : }
1702 :
1703 : static sql_exp *
1704 71749063 : rel_find_exp_and_corresponding_rel_(sql_rel *rel, sql_exp *e, bool subexp, sql_rel **res)
1705 : {
1706 71749063 : sql_exp *ne = NULL;
1707 :
1708 71749063 : if (!rel)
1709 : return NULL;
1710 71748982 : switch(e->type) {
1711 70442792 : case e_column:
1712 70442792 : if (is_basetable(rel->op) && !rel->exps) {
1713 16158 : if (e->l) {
1714 16156 : if (rel_base_bind_column2_(rel, e->l, e->r))
1715 14115 : ne = e;
1716 2 : } else if (rel_base_bind_column_(rel, e->r))
1717 14115 : ne = e;
1718 90483933 : } else if ((!list_empty(rel->exps) && (is_project(rel->op) || is_base(rel->op))) ||
1719 20548964 : (!list_empty(rel->attr) && is_join(rel->op))) {
1720 50860992 : list *l = rel->attr ? rel->attr : rel->exps;
1721 50860992 : if (e->l) {
1722 49608579 : ne = exps_bind_column2(l, e->l, e->r, NULL);
1723 : } else {
1724 1252413 : ne = exps_bind_column(l, e->r, NULL, NULL, 1);
1725 : }
1726 : }
1727 70442820 : if (ne && res)
1728 62856 : *res = rel;
1729 : return ne;
1730 547050 : case e_convert:
1731 547050 : return rel_find_exp_and_corresponding_rel_(rel, e->l, subexp, res);
1732 427727 : case e_aggr:
1733 : case e_func:
1734 427727 : if (e->l) {
1735 425655 : list *l = e->l;
1736 425655 : node *n = l->h;
1737 :
1738 425655 : ne = n->data;
1739 1122342 : while ((subexp || ne != NULL) && n != NULL) {
1740 705222 : ne = rel_find_exp_and_corresponding_rel_(rel, n->data, subexp, res);
1741 705222 : if (subexp && ne)
1742 : break;
1743 696687 : n = n->next;
1744 : }
1745 425655 : return ne;
1746 : }
1747 : break;
1748 : /* fall through */
1749 : case e_cmp:
1750 : case e_psm:
1751 : return NULL;
1752 330673 : case e_atom:
1753 330673 : if (e->f) { /* values */
1754 7446 : list *l = e->f;
1755 7446 : node *n = l->h;
1756 :
1757 7446 : ne = n->data;
1758 17098 : while ((subexp || ne != NULL) && n != NULL) {
1759 9652 : ne = rel_find_exp_and_corresponding_rel_(rel, n->data, subexp, res);
1760 9652 : if (subexp && ne)
1761 : break;
1762 9652 : n = n->next;
1763 : }
1764 7446 : return ne;
1765 : }
1766 : return e;
1767 : }
1768 : return ne;
1769 : }
1770 :
1771 : sql_exp *
1772 70487068 : rel_find_exp_and_corresponding_rel(sql_rel *rel, sql_exp *e, bool subexp, sql_rel **res, bool *under_join)
1773 : {
1774 70487068 : sql_exp *ne = rel_find_exp_and_corresponding_rel_(rel, e, subexp, res);
1775 :
1776 70487186 : if (rel && !ne) {
1777 51314315 : switch(rel->op) {
1778 13282385 : case op_left:
1779 : case op_right:
1780 : case op_full:
1781 : case op_join:
1782 : case op_semi:
1783 : case op_anti:
1784 13282385 : ne = rel_find_exp_and_corresponding_rel(rel->l, e, subexp, res, under_join);
1785 13282385 : if (!ne && is_join(rel->op))
1786 8589483 : ne = rel_find_exp_and_corresponding_rel(rel->r, e, subexp, res, under_join);
1787 : break;
1788 : case op_table:
1789 : case op_basetable:
1790 : break;
1791 296668 : case op_munion:
1792 763834 : for (node* n = ((list*)rel->l)->h; n && !ne; n = n->next)
1793 467166 : ne = rel_find_exp_and_corresponding_rel(n->data, e, subexp, res, under_join);
1794 : break;
1795 10602818 : default:
1796 10602818 : if (!is_project(rel->op) && rel->l)
1797 6763017 : ne = rel_find_exp_and_corresponding_rel(rel->l, e, subexp, res, under_join);
1798 : }
1799 : }
1800 70487186 : if (ne && under_join && is_join(rel->op))
1801 2903361 : *under_join = true;
1802 70487186 : return ne;
1803 : }
1804 :
1805 : sql_exp *
1806 16424389 : rel_find_exp(sql_rel *rel, sql_exp *e)
1807 : {
1808 16424389 : return rel_find_exp_and_corresponding_rel(rel, e, false, NULL, NULL);
1809 : }
1810 :
1811 : int
1812 3982058 : exp_is_true(sql_exp *e)
1813 : {
1814 3982058 : if (e->type == e_atom && e->l)
1815 19582 : return atom_is_true(e->l);
1816 3962476 : if (e->type == e_cmp && e->flag == cmp_equal)
1817 3211889 : return (exp_is_true(e->l) && exp_is_true(e->r) && exp_match_exp(e->l, e->r));
1818 : return 0;
1819 : }
1820 :
1821 : static inline bool
1822 307466 : exp_is_cmp_exp_is_false(sql_exp* e)
1823 : {
1824 307466 : sql_exp *l = e->l;
1825 307466 : sql_exp *r = e->r;
1826 307466 : assert(e->type == e_cmp && e->f == NULL && l && r);
1827 :
1828 : /* Handle 'v is x' and 'v is not x' expressions.
1829 : * Other cases in is-semantics are unspecified.
1830 : */
1831 307466 : if (e->flag != cmp_equal && e->flag != cmp_notequal)
1832 : return false;
1833 307466 : if (e->flag == cmp_equal && !is_anti(e))
1834 487966 : return ((exp_is_null(l) && exp_is_not_null(r)) || (exp_is_not_null(l) && exp_is_null(r)));
1835 63483 : if ((e->flag == cmp_notequal && !is_anti(e)) || (e->flag == cmp_equal && is_anti(e)))
1836 126914 : return exp_is_null(l) && exp_is_null(r);
1837 : return false;
1838 : }
1839 :
1840 : static inline bool
1841 5376411 : exp_single_bound_cmp_exp_is_false(sql_exp* e) {
1842 5376411 : assert(e->type == e_cmp);
1843 5376411 : sql_exp* l = e->l;
1844 5376411 : sql_exp* r = e->r;
1845 5376411 : assert(e->f == NULL);
1846 5376411 : assert (l && r);
1847 :
1848 5376411 : return exp_is_null(l) || exp_is_null(r);
1849 : }
1850 :
1851 : static inline bool
1852 73961 : exp_two_sided_bound_cmp_exp_is_false(sql_exp* e) {
1853 73961 : assert(e->type == e_cmp);
1854 73961 : sql_exp* v = e->l;
1855 73961 : sql_exp* l = e->r;
1856 73961 : sql_exp* h = e->f;
1857 73961 : assert (v && l && h);
1858 :
1859 73961 : return is_anti(e) ? exp_is_null(v) || (exp_is_null(l) && exp_is_null(h)) : false;
1860 : }
1861 :
1862 : static inline bool
1863 5765637 : exp_regular_cmp_exp_is_false(sql_exp* e) {
1864 5765637 : assert(e->type == e_cmp);
1865 :
1866 5765637 : if (is_semantics(e) && !is_any(e)) return exp_is_cmp_exp_is_false(e);
1867 5458171 : if (is_any(e)) return false;
1868 5450372 : if (e -> f) return exp_two_sided_bound_cmp_exp_is_false(e);
1869 5376411 : else return exp_single_bound_cmp_exp_is_false(e);
1870 : }
1871 :
1872 : static inline bool
1873 593439 : exp_or_exp_is_false(sql_exp* e) {
1874 593439 : assert(e->type == e_cmp && e->flag == cmp_or);
1875 :
1876 593439 : list* left = e->l;
1877 593439 : list* right = e->r;
1878 :
1879 593439 : bool left_is_false = false;
1880 1238193 : for(node* n = left->h; n; n=n->next) {
1881 645121 : if (exp_is_false(n->data)) {
1882 : left_is_false=true;
1883 : break;
1884 : }
1885 : }
1886 :
1887 593439 : if (!left_is_false) {
1888 : return false;
1889 : }
1890 :
1891 689 : for(node* n = right->h; n; n=n->next) {
1892 387 : if (exp_is_false(n->data)) {
1893 : return true;
1894 : }
1895 : }
1896 :
1897 : return false;
1898 : }
1899 :
1900 : static inline bool
1901 6676445 : exp_cmp_exp_is_false(sql_exp* e) {
1902 6676445 : assert(e->type == e_cmp);
1903 :
1904 6676445 : switch (e->flag) {
1905 5765637 : case cmp_gt:
1906 : case cmp_gte:
1907 : case cmp_lte:
1908 : case cmp_lt:
1909 : case cmp_equal:
1910 : case cmp_notequal:
1911 5765637 : return exp_regular_cmp_exp_is_false(e);
1912 593439 : case cmp_or:
1913 593439 : return exp_or_exp_is_false(e);
1914 : default:
1915 : return false;
1916 : }
1917 : }
1918 :
1919 : int
1920 6752692 : exp_is_false(sql_exp *e)
1921 : {
1922 6752692 : if (e->type == e_atom && e->l)
1923 33349 : return atom_is_false(e->l);
1924 6719343 : else if (e->type == e_cmp)
1925 6676445 : return exp_cmp_exp_is_false(e);
1926 : return 0;
1927 : }
1928 :
1929 : int
1930 17333 : exp_is_zero(sql_exp *e)
1931 : {
1932 17333 : if (e->type == e_atom && e->l)
1933 17036 : return atom_is_zero(e->l);
1934 : return 0;
1935 : }
1936 :
1937 : int
1938 363992 : exp_is_not_null(sql_exp *e)
1939 : {
1940 364421 : if (!has_nil(e))
1941 : return true;
1942 :
1943 220755 : switch (e->type) {
1944 2729 : case e_atom:
1945 2729 : if (e->f) /* values list */
1946 : return false;
1947 2729 : if (e->l)
1948 2601 : return !(atom_null(e->l));
1949 : return false;
1950 429 : case e_convert:
1951 429 : return exp_is_not_null(e->l);
1952 776 : case e_func:
1953 776 : if (!is_semantics(e) && e->l) {
1954 413 : list *l = e->l;
1955 460 : for (node *n = l->h; n; n=n->next) {
1956 460 : sql_exp *p = n->data;
1957 460 : if (!exp_is_not_null(p))
1958 : return false;
1959 : }
1960 : return true;
1961 : }
1962 : return false;
1963 : case e_aggr:
1964 : case e_column:
1965 : case e_cmp:
1966 : case e_psm:
1967 : return false;
1968 : }
1969 : return false;
1970 : }
1971 :
1972 : int
1973 12021384 : exp_is_null(sql_exp *e )
1974 : {
1975 12098215 : if (!has_nil(e))
1976 : return false;
1977 :
1978 7068183 : switch (e->type) {
1979 200658 : case e_atom:
1980 200658 : if (e->f) /* values list */
1981 : return 0;
1982 200658 : if (e->l)
1983 124189 : return (atom_null(e->l));
1984 : return 0;
1985 76831 : case e_convert:
1986 76831 : return exp_is_null(e->l);
1987 155336 : case e_func:
1988 155336 : if (!is_semantics(e) && e->l) {
1989 : /* This is a call to a function with no-nil semantics.
1990 : * If one of the parameters is null the expression itself is null
1991 : */
1992 142767 : list* l = e->l;
1993 425874 : for(node* n = l->h; n; n=n->next) {
1994 283266 : sql_exp* p = n->data;
1995 283266 : if (exp_is_null(p)) {
1996 : return true;
1997 : }
1998 : }
1999 : }
2000 : return 0;
2001 : case e_aggr:
2002 : case e_column:
2003 : case e_cmp:
2004 : case e_psm:
2005 : return 0;
2006 : }
2007 : return 0;
2008 : }
2009 :
2010 : int
2011 1809817 : exp_is_rel( sql_exp *e )
2012 : {
2013 1819012 : if (e) {
2014 1819012 : switch(e->type){
2015 9195 : case e_convert:
2016 9195 : return exp_is_rel(e->l);
2017 335216 : case e_psm:
2018 335216 : return e->flag == PSM_REL && e->l;
2019 : default:
2020 : return 0;
2021 : }
2022 : }
2023 : return 0;
2024 : }
2025 :
2026 : int
2027 7106 : exps_one_is_rel(list *exps)
2028 : {
2029 7106 : if (list_empty(exps))
2030 : return 0;
2031 21217 : for(node *n = exps->h ; n ; n = n->next)
2032 14119 : if (exp_is_rel(n->data))
2033 : return 1;
2034 : return 0;
2035 : }
2036 :
2037 : int
2038 8322130 : exp_is_atom( sql_exp *e )
2039 : {
2040 8562070 : switch (e->type) {
2041 1142965 : case e_atom:
2042 1142965 : if (e->f) /* values list */
2043 : return 0;
2044 : return 1;
2045 239940 : case e_convert:
2046 239940 : return exp_is_atom(e->l);
2047 1187687 : case e_func:
2048 : case e_aggr:
2049 1187687 : return e->card == CARD_ATOM && exps_are_atoms(e->l);
2050 2697 : case e_cmp:
2051 2697 : if (e->card != CARD_ATOM)
2052 : return 0;
2053 141 : if (e->flag == cmp_or || e->flag == cmp_filter)
2054 79 : return exps_are_atoms(e->l) && exps_are_atoms(e->r);
2055 66 : if (e->flag == cmp_in || e->flag == cmp_notin)
2056 0 : return exp_is_atom(e->l) && exps_are_atoms(e->r);
2057 66 : return exp_is_atom(e->l) && exp_is_atom(e->r) && (!e->f || exp_is_atom(e->f));
2058 : case e_column:
2059 : case e_psm:
2060 : return 0;
2061 : }
2062 : return 0;
2063 : }
2064 :
2065 : int
2066 29270441 : exp_has_rel( sql_exp *e )
2067 : {
2068 29892465 : if (!e)
2069 : return 0;
2070 29890951 : switch(e->type){
2071 4438884 : case e_func:
2072 : case e_aggr:
2073 4438884 : return exps_have_rel_exp(e->l);
2074 673163 : case e_cmp:
2075 673163 : if (e->flag == cmp_or || e->flag == cmp_filter) {
2076 74544 : return (exps_have_rel_exp(e->l) || exps_have_rel_exp(e->r));
2077 599095 : } else if (e->flag == cmp_in || e->flag == cmp_notin) {
2078 36231 : return (exp_has_rel(e->l) || exps_have_rel_exp(e->r));
2079 : } else {
2080 1125728 : return (exp_has_rel(e->l) || exp_has_rel(e->r) || (e->f && exp_has_rel(e->f)));
2081 : }
2082 622024 : case e_convert:
2083 622024 : return exp_has_rel(e->l);
2084 166278 : case e_psm:
2085 166278 : return exp_is_rel(e);
2086 12528915 : case e_atom:
2087 12528915 : return (e->f && exps_have_rel_exp(e->f));
2088 : case e_column:
2089 : return 0;
2090 : }
2091 : return 0;
2092 : }
2093 :
2094 : int
2095 5187142 : exps_have_rel_exp( list *exps)
2096 : {
2097 5187142 : if (list_empty(exps))
2098 : return 0;
2099 16882990 : for(node *n=exps->h; n; n=n->next) {
2100 11820489 : sql_exp *e = n->data;
2101 :
2102 11820489 : if (exp_has_rel(e))
2103 : return 1;
2104 : }
2105 : return 0;
2106 : }
2107 :
2108 : static sql_rel *
2109 547 : exps_rel_get_rel(allocator *sa, list *exps )
2110 : {
2111 547 : sql_rel *r = NULL, *xp = NULL;
2112 :
2113 547 : if (list_empty(exps))
2114 : return NULL;
2115 1612 : for (node *n = exps->h; n; n=n->next){
2116 1065 : sql_exp *e = n->data;
2117 :
2118 1065 : if (exp_has_rel(e)) {
2119 552 : if (!(r = exp_rel_get_rel(sa, e)))
2120 : return NULL;
2121 552 : if (xp) {
2122 5 : xp = rel_crossproduct(sa, xp, r, op_full);
2123 5 : set_processed(xp);
2124 : } else {
2125 : xp = r;
2126 : }
2127 : }
2128 : }
2129 : return xp;
2130 : }
2131 :
2132 : int
2133 45 : exp_rel_depth(sql_exp *e)
2134 : {
2135 45 : if (!e)
2136 : return 0;
2137 45 : switch(e->type){
2138 : case e_func:
2139 : case e_aggr:
2140 : case e_cmp:
2141 : return 1;
2142 : case e_convert:
2143 : return 0;
2144 33 : case e_psm:
2145 33 : if (exp_is_rel(e))
2146 : return 0;
2147 : return 1;
2148 : case e_atom:
2149 : case e_column:
2150 : return 0;
2151 : }
2152 : return 0;
2153 : }
2154 :
2155 : sql_rel *
2156 73643 : exp_rel_get_rel(allocator *sa, sql_exp *e)
2157 : {
2158 74534 : if (!e)
2159 : return NULL;
2160 :
2161 74534 : switch(e->type){
2162 519 : case e_func:
2163 : case e_aggr:
2164 519 : return exps_rel_get_rel(sa, e->l);
2165 36 : case e_cmp: {
2166 36 : sql_rel *r = NULL, *xp = NULL;
2167 :
2168 36 : if (e->flag == cmp_or || e->flag == cmp_filter) {
2169 12 : if (exps_have_rel_exp(e->l))
2170 6 : xp = exps_rel_get_rel(sa, e->l);
2171 12 : if (exps_have_rel_exp(e->r)) {
2172 7 : if (!(r = exps_rel_get_rel(sa, e->r)))
2173 : return NULL;
2174 7 : if (xp) {
2175 1 : xp = rel_crossproduct(sa, xp, r, op_join);
2176 1 : set_processed(xp);
2177 : } else {
2178 : xp = r;
2179 : }
2180 : }
2181 24 : } else if (e->flag == cmp_in || e->flag == cmp_notin) {
2182 0 : if (exp_has_rel(e->l))
2183 0 : xp = exp_rel_get_rel(sa, e->l);
2184 0 : if (exps_have_rel_exp(e->r)) {
2185 0 : if (!(r = exps_rel_get_rel(sa, e->r)))
2186 : return NULL;
2187 0 : if (xp) {
2188 0 : xp = rel_crossproduct(sa, xp, r, op_join);
2189 0 : set_processed(xp);
2190 : } else {
2191 : xp = r;
2192 : }
2193 : }
2194 : } else {
2195 24 : if (exp_has_rel(e->l))
2196 23 : xp = exp_rel_get_rel(sa, e->l);
2197 24 : if (exp_has_rel(e->r)) {
2198 6 : if (!(r = exp_rel_get_rel(sa, e->r)))
2199 : return NULL;
2200 6 : if (xp) {
2201 5 : xp = rel_crossproduct(sa, xp, r, op_join);
2202 5 : set_processed(xp);
2203 : } else {
2204 : xp = r;
2205 : }
2206 : }
2207 24 : if (e->f && exp_has_rel(e->f)) {
2208 0 : if (!(r = exp_rel_get_rel(sa, e->f)))
2209 : return NULL;
2210 0 : if (xp) {
2211 0 : xp = rel_crossproduct(sa, xp, r, op_join);
2212 0 : set_processed(xp);
2213 : } else {
2214 : xp = r;
2215 : }
2216 : }
2217 : }
2218 : return xp;
2219 : }
2220 891 : case e_convert:
2221 891 : return exp_rel_get_rel(sa, e->l);
2222 73073 : case e_psm:
2223 73073 : if (exp_is_rel(e))
2224 73073 : return e->l;
2225 : return NULL;
2226 15 : case e_atom:
2227 15 : if (e->f && exps_have_rel_exp(e->f))
2228 15 : return exps_rel_get_rel(sa, e->f);
2229 : return NULL;
2230 : case e_column:
2231 : return NULL;
2232 : }
2233 : return NULL;
2234 : }
2235 :
2236 : static void exp_rel_update_set_freevar(sql_exp *e);
2237 :
2238 : static void
2239 901 : exps_rel_update_set_freevar(list *exps)
2240 : {
2241 901 : if (!list_empty(exps))
2242 2930 : for (node *n=exps->h; n ; n=n->next)
2243 2029 : exp_rel_update_set_freevar(n->data);
2244 901 : }
2245 :
2246 : static void
2247 2313 : exp_rel_update_set_freevar(sql_exp *e)
2248 : {
2249 2323 : if (!e)
2250 : return ;
2251 :
2252 2323 : switch(e->type){
2253 898 : case e_func:
2254 : case e_aggr:
2255 898 : exps_rel_update_set_freevar(e->l);
2256 898 : break;
2257 8 : case e_cmp:
2258 8 : if (e->flag == cmp_or || e->flag == cmp_filter) {
2259 0 : exps_rel_update_set_freevar(e->l);
2260 0 : exps_rel_update_set_freevar(e->r);
2261 8 : } else if (e->flag == cmp_in || e->flag == cmp_notin) {
2262 0 : exp_rel_update_set_freevar(e->l);
2263 0 : exps_rel_update_set_freevar(e->r);
2264 : } else {
2265 8 : exp_rel_update_set_freevar(e->l);
2266 8 : exp_rel_update_set_freevar(e->r);
2267 8 : if (e->f)
2268 : exp_rel_update_set_freevar(e->f);
2269 : }
2270 : break;
2271 7 : case e_convert:
2272 7 : exp_rel_update_set_freevar(e->l);
2273 7 : break;
2274 1135 : case e_atom:
2275 1135 : if (e->f)
2276 3 : exps_rel_update_set_freevar(e->f);
2277 : break;
2278 275 : case e_column:
2279 275 : set_freevar(e, 1);
2280 275 : break;
2281 : case e_psm:
2282 : break;
2283 : }
2284 : }
2285 :
2286 : static list *
2287 547 : exp_rel_update_exps(mvc *sql, list *exps, bool up)
2288 : {
2289 547 : if (list_empty(exps))
2290 : return exps;
2291 1612 : for (node *n = exps->h; n; n=n->next){
2292 1065 : sql_exp *e = n->data;
2293 :
2294 1065 : if (exp_has_rel(e))
2295 552 : n->data = exp_rel_update_exp(sql, e, up);
2296 513 : else if (!exp_is_atom(e) && !up)
2297 262 : exp_rel_update_set_freevar(e);
2298 : }
2299 : return exps;
2300 : }
2301 :
2302 : static sql_exp *
2303 51 : exp_rel_update_exp_(mvc *sql, sql_exp *e, bool up)
2304 : {
2305 51 : if (exp_has_rel(e))
2306 28 : e = exp_rel_update_exp(sql, e, up);
2307 23 : else if (!exp_is_atom(e) && !up)
2308 6 : exp_rel_update_set_freevar(e);
2309 51 : return e;
2310 : }
2311 :
2312 : sql_exp *
2313 12743 : exp_rel_update_exp(mvc *sql, sql_exp *e, bool up)
2314 : {
2315 12743 : if (!e)
2316 : return NULL;
2317 :
2318 12743 : switch(e->type){
2319 519 : case e_func:
2320 : case e_aggr:
2321 519 : if (exps_have_rel_exp(e->l))
2322 519 : e->l = exp_rel_update_exps(sql, e->l, up);
2323 : return e;
2324 35 : case e_cmp:
2325 35 : if (e->flag == cmp_or || e->flag == cmp_filter) {
2326 12 : if (exps_have_rel_exp(e->l))
2327 6 : e->l = exp_rel_update_exps(sql, e->l, up);
2328 12 : if (exps_have_rel_exp(e->r))
2329 7 : e->r = exp_rel_update_exps(sql, e->r, up);
2330 23 : } else if (e->flag == cmp_in || e->flag == cmp_notin) {
2331 0 : if (exp_has_rel(e->l))
2332 0 : e->l = exp_rel_update_exp(sql, e->l, up);
2333 0 : if (exps_have_rel_exp(e->r))
2334 0 : e->r = exp_rel_update_exps(sql, e->r, up);
2335 : } else {
2336 : //if (exp_has_rel(e->l))
2337 23 : e->l = exp_rel_update_exp_(sql, e->l, up);
2338 : //if (exp_has_rel(e->r))
2339 23 : e->r = exp_rel_update_exp_(sql, e->r, up);
2340 23 : if (e->f /*&& exp_has_rel(e->f)*/)
2341 5 : e->f = exp_rel_update_exp_(sql, e->f, up);
2342 : }
2343 : return e;
2344 891 : case e_convert:
2345 891 : if (exp_has_rel(e->l))
2346 891 : e->l = exp_rel_update_exp(sql, e->l, up);
2347 : return e;
2348 11283 : case e_psm:
2349 11283 : if (exp_is_rel(e)) {
2350 11283 : sql_rel *r = exp_rel_get_rel(sql->sa, e), *nr = r;
2351 11283 : if (is_topn(r->op)) {
2352 2 : nr = r->l;
2353 2 : if (nr && !is_project(nr->op))
2354 0 : r->l = nr = rel_project(sql->sa, nr, rel_projections(sql, nr, NULL, 1, 0));
2355 : }
2356 11283 : e = nr->exps->t->data;
2357 11283 : e = exp_ref(sql, e);
2358 11283 : if (up)
2359 0 : set_freevar(e, 1);
2360 11283 : return e;
2361 : }
2362 : return e;
2363 15 : case e_atom:
2364 15 : if (e->f && exps_have_rel_exp(e->f))
2365 15 : e->f = exp_rel_update_exps(sql, e->f, up);
2366 : return e;
2367 : case e_column:
2368 : return e;
2369 : }
2370 : return e;
2371 : }
2372 :
2373 : sql_exp *
2374 3725 : exp_rel_label(mvc *sql, sql_exp *e)
2375 : {
2376 3725 : if (exp_is_rel(e))
2377 3725 : e->l = rel_label(sql, e->l, 1);
2378 3725 : return e;
2379 : }
2380 :
2381 : int
2382 162559 : exps_are_atoms( list *exps)
2383 : {
2384 162559 : int atoms = 1;
2385 162559 : if (!list_empty(exps))
2386 390196 : for(node *n=exps->h; n && atoms; n=n->next)
2387 277401 : atoms &= exp_is_atom(n->data);
2388 162562 : return atoms;
2389 : }
2390 :
2391 : int
2392 83 : exps_have_func(list *exps)
2393 : {
2394 83 : if (list_empty(exps))
2395 : return 0;
2396 131 : for(node *n=exps->h; n; n=n->next) {
2397 98 : sql_exp *e = n->data;
2398 :
2399 98 : if (exp_has_func(e))
2400 : return 1;
2401 : }
2402 : return 0;
2403 : }
2404 :
2405 : static int exp_has_func_or_cmp(sql_exp *e, bool cmp);
2406 :
2407 : static int
2408 63041 : exps_have_func_or_cmp(list *exps, bool cmp)
2409 : {
2410 63041 : if (list_empty(exps))
2411 : return 0;
2412 184345 : for(node *n=exps->h; n; n=n->next) {
2413 130543 : sql_exp *e = n->data;
2414 :
2415 130543 : if (exp_has_func_or_cmp(e, cmp))
2416 : return 1;
2417 : }
2418 : return 0;
2419 : }
2420 :
2421 : static int
2422 2077678 : exp_has_func_or_cmp(sql_exp *e, bool cmp)
2423 : {
2424 2077678 : if (!e)
2425 : return 0;
2426 2077678 : switch (e->type) {
2427 308868 : case e_atom:
2428 308868 : if (e->f)
2429 0 : return exps_have_func_or_cmp(e->f, true);
2430 : return 0;
2431 15027 : case e_convert:
2432 15027 : return exp_has_func_or_cmp(e->l, cmp);
2433 : case e_func:
2434 : return 1;
2435 15561 : case e_aggr:
2436 15561 : if (e->l)
2437 13084 : return exps_have_func_or_cmp(e->l, true);
2438 : return 0;
2439 272266 : case e_cmp:
2440 272266 : if (cmp)
2441 : return 1;
2442 263131 : if (e->flag == cmp_or || e->flag == cmp_filter) {
2443 21790 : return (exps_have_func_or_cmp(e->l, true) || exps_have_func_or_cmp(e->r, true));
2444 250517 : } else if (e->flag == cmp_in || e->flag == cmp_notin) {
2445 33944 : return (exp_has_func_or_cmp(e->l, true) || exps_have_func_or_cmp(e->r, true));
2446 : } else {
2447 433236 : return (exp_has_func_or_cmp(e->l, true) || exp_has_func_or_cmp(e->r, true) ||
2448 201183 : (e->f && exp_has_func_or_cmp(e->f, true)));
2449 : }
2450 : case e_column:
2451 : case e_psm:
2452 : return 0;
2453 : }
2454 : return 0;
2455 : }
2456 :
2457 : int
2458 1477701 : exp_has_func(sql_exp *e)
2459 : {
2460 1477701 : return exp_has_func_or_cmp(e, false);
2461 : }
2462 :
2463 : static int
2464 727368 : exps_has_sideeffect( list *exps)
2465 : {
2466 727368 : node *n;
2467 727368 : int has_sideeffect = 0;
2468 :
2469 2230048 : for(n=exps->h; n && !has_sideeffect; n=n->next)
2470 1502681 : has_sideeffect |= exp_has_sideeffect(n->data);
2471 727367 : return has_sideeffect;
2472 : }
2473 :
2474 : int
2475 1688081 : exp_has_sideeffect( sql_exp *e )
2476 : {
2477 1712860 : switch (e->type) {
2478 24779 : case e_convert:
2479 24779 : return exp_has_sideeffect(e->l);
2480 727388 : case e_func:
2481 : {
2482 727388 : sql_subfunc *f = e->f;
2483 :
2484 727388 : if (f->func->side_effect)
2485 : return 1;
2486 727375 : if (e->l)
2487 727368 : return exps_has_sideeffect(e->l);
2488 : return 0;
2489 : }
2490 473811 : case e_atom:
2491 473811 : if (e->f)
2492 0 : return exps_has_sideeffect(e->f);
2493 : return 0;
2494 : case e_aggr:
2495 : case e_cmp:
2496 : case e_column:
2497 : case e_psm:
2498 : return 0;
2499 : }
2500 : return 0;
2501 : }
2502 :
2503 : int
2504 782396 : exps_have_unsafe(list *exps, int allow_identity)
2505 : {
2506 782396 : int unsafe = 0;
2507 :
2508 782396 : if (list_empty(exps))
2509 : return 0;
2510 2695166 : for (node *n = exps->h; n && !unsafe; n = n->next)
2511 1919140 : unsafe |= exp_unsafe(n->data, allow_identity);
2512 : return unsafe;
2513 : }
2514 :
2515 : int
2516 6510817 : exp_unsafe(sql_exp *e, int allow_identity)
2517 : {
2518 6784168 : switch (e->type) {
2519 273351 : case e_convert:
2520 273351 : return exp_unsafe(e->l, allow_identity);
2521 846951 : case e_aggr:
2522 : case e_func: {
2523 846951 : sql_subfunc *f = e->f;
2524 :
2525 846951 : if (IS_ANALYTIC(f->func) || !LANG_INT_OR_MAL(f->func->lang) || f->func->side_effect || (!allow_identity && is_identity(e, NULL)))
2526 114794 : return 1;
2527 732157 : return exps_have_unsafe(e->l, allow_identity);
2528 518 : } break;
2529 518 : case e_cmp: {
2530 518 : if (e->flag == cmp_in || e->flag == cmp_notin) {
2531 0 : return exp_unsafe(e->l, allow_identity) || exps_have_unsafe(e->r, allow_identity);
2532 518 : } else if (e->flag == cmp_or || e->flag == cmp_filter) {
2533 216 : return exps_have_unsafe(e->l, allow_identity) || exps_have_unsafe(e->r, allow_identity);
2534 : } else {
2535 604 : return exp_unsafe(e->l, allow_identity) || exp_unsafe(e->r, allow_identity) || (e->f && exp_unsafe(e->f, allow_identity));
2536 : }
2537 597795 : } break;
2538 597795 : case e_atom: {
2539 597795 : if (e->f)
2540 0 : return exps_have_unsafe(e->f, allow_identity);
2541 : return 0;
2542 : } break;
2543 : case e_column:
2544 : case e_psm:
2545 : return 0;
2546 : }
2547 : return 0;
2548 : }
2549 :
2550 : static inline int
2551 8765826 : exp_key( sql_exp *e )
2552 : {
2553 8765826 : if (e->alias.name)
2554 8765494 : return hash_key(e->alias.name);
2555 : return 0;
2556 : }
2557 :
2558 : sql_exp *
2559 3053925 : exps_bind_column(list *exps, const char *cname, int *ambiguous, int *multiple, int no_tname)
2560 : {
2561 3053925 : sql_exp *res = NULL;
2562 :
2563 3053925 : if (exps && cname) {
2564 3053752 : node *en;
2565 :
2566 3053752 : if (exps) {
2567 3053752 : if (!exps->ht && list_length(exps) > HASH_MIN_SIZE) {
2568 124663 : exps->ht = hash_new(exps->sa, list_length(exps), (fkeyvalue)&exp_key);
2569 124663 : if (exps->ht == NULL)
2570 : return NULL;
2571 1183136 : for (en = exps->h; en; en = en->next ) {
2572 1058473 : sql_exp *e = en->data;
2573 1058473 : if (e->alias.name) {
2574 1058473 : int key = exp_key(e);
2575 :
2576 1058473 : if (hash_add(exps->ht, key, e) == NULL)
2577 : return NULL;
2578 : }
2579 : }
2580 : }
2581 3053752 : if (exps->ht) {
2582 2231985 : int key = hash_key(cname);
2583 2231985 : sql_hash_e *he = exps->ht->buckets[key&(exps->ht->size-1)];
2584 :
2585 5273208 : for (; he; he = he->chain) {
2586 3041227 : sql_exp *e = he->value;
2587 :
2588 3041227 : if (e->alias.name && strcmp(e->alias.name, cname) == 0 && (!no_tname || !e->alias.rname)) {
2589 1273591 : if (res && multiple)
2590 4 : *multiple = 1;
2591 1273591 : if (!res)
2592 1273591 : res = e;
2593 :
2594 1273591 : if (res && res != e && e->alias.rname && res->alias.rname && strcmp(e->alias.rname, res->alias.rname) != 0 ) {
2595 4 : if (ambiguous)
2596 4 : *ambiguous = 1;
2597 4 : return NULL;
2598 : }
2599 : res = e;
2600 : }
2601 : }
2602 2231981 : return res;
2603 : }
2604 : }
2605 2772479 : for (en = exps->h; en; en = en->next ) {
2606 1950717 : sql_exp *e = en->data;
2607 :
2608 1950717 : if (e->alias.name && strcmp(e->alias.name, cname) == 0 && (!no_tname || !e->alias.rname)) {
2609 75587 : if (res && multiple)
2610 8 : *multiple = 1;
2611 75587 : if (!res)
2612 75587 : res = e;
2613 :
2614 75587 : if (res && res != e && e->alias.rname && res->alias.rname && strcmp(e->alias.rname, res->alias.rname) != 0 ) {
2615 5 : if (ambiguous)
2616 5 : *ambiguous = 1;
2617 5 : return NULL;
2618 : }
2619 : res = e;
2620 : }
2621 : }
2622 : }
2623 : return res;
2624 : }
2625 :
2626 : sql_exp *
2627 56481665 : exps_bind_column2(list *exps, const char *rname, const char *cname, int *multiple)
2628 : {
2629 56481665 : sql_exp *res = NULL;
2630 :
2631 56481665 : if (exps) {
2632 56411873 : node *en;
2633 :
2634 56411873 : if (!exps->ht && list_length(exps) > HASH_MIN_SIZE) {
2635 476391 : exps->ht = hash_new(exps->sa, list_length(exps), (fkeyvalue)&exp_key);
2636 476392 : if (exps->ht == NULL)
2637 : return res;
2638 :
2639 6633745 : for (en = exps->h; en; en = en->next ) {
2640 6157349 : sql_exp *e = en->data;
2641 6157349 : if (e->alias.name) {
2642 6146321 : int key = exp_key(e);
2643 :
2644 6146352 : if (hash_add(exps->ht, key, e) == NULL)
2645 : return res;
2646 : }
2647 : }
2648 : }
2649 56412239 : if (exps->ht) {
2650 22164931 : int key = hash_key(cname);
2651 22164931 : sql_hash_e *he = exps->ht->buckets[key&(exps->ht->size-1)];
2652 :
2653 56255082 : for (; he; he = he->chain) {
2654 34743246 : sql_exp *e = he->value;
2655 :
2656 34743246 : if (e && e->alias.name && e->alias.rname && strcmp(e->alias.name, cname) == 0 && strcmp(e->alias.rname, rname) == 0) {
2657 14473344 : if (res && multiple)
2658 0 : *multiple = 1;
2659 14473344 : if (!res)
2660 : res = e;
2661 14473344 : if (res && res->alias.label) /* aliases maybe used multiple times without problems */
2662 653095 : return res;
2663 : }
2664 : }
2665 21511836 : return res;
2666 : }
2667 145710686 : for (en = exps->h; en; en = en->next ) {
2668 112775986 : sql_exp *e = en->data;
2669 :
2670 112775986 : if (e && e->alias.name && e->alias.rname && strcmp(e->alias.name, cname) == 0 && strcmp(e->alias.rname, rname) == 0) {
2671 7649123 : if (res && multiple)
2672 2 : *multiple = 1;
2673 7649123 : if (!res)
2674 : res = e;
2675 7649123 : if (res && res->alias.label) /* aliases maybe used multiple times without problems */
2676 1312608 : return res;
2677 : }
2678 : }
2679 : }
2680 : return res;
2681 : }
2682 :
2683 : /* find an column based on the original name, not the alias it got */
2684 : sql_exp *
2685 332 : exps_bind_alias( list *exps, const char *rname, const char *cname )
2686 : {
2687 332 : if (exps) {
2688 332 : node *en;
2689 :
2690 759 : for (en = exps->h; en; en = en->next ) {
2691 431 : sql_exp *e = en->data;
2692 :
2693 431 : if (e && is_column(e->type) && !rname && e->r && strcmp(e->r, cname) == 0)
2694 0 : return e;
2695 431 : if (e && e->type == e_column && rname && e->l && e->r && strcmp(e->r, cname) == 0 && strcmp(e->l, rname) == 0) {
2696 4 : return e;
2697 : }
2698 : }
2699 : }
2700 : return NULL;
2701 : }
2702 :
2703 : unsigned int
2704 3141929 : exps_card( list *l )
2705 : {
2706 3141929 : node *n;
2707 3141929 : unsigned int card = CARD_ATOM;
2708 :
2709 13916774 : if (l) for(n = l->h; n; n = n->next) {
2710 10774845 : sql_exp *e = n->data;
2711 :
2712 10774845 : if (e && card < e->card)
2713 10774845 : card = e->card;
2714 : }
2715 3141929 : return card;
2716 : }
2717 :
2718 : void
2719 38930 : exps_fix_card( list *exps, unsigned int card)
2720 : {
2721 38930 : if (exps)
2722 969892 : for (node *n = exps->h; n; n = n->next) {
2723 930962 : sql_exp *e = n->data;
2724 :
2725 930962 : if (e && e->card > card)
2726 0 : e->card = card;
2727 : }
2728 38930 : }
2729 :
2730 : void
2731 3991 : exps_setcard( list *exps, unsigned int card)
2732 : {
2733 3991 : if (exps)
2734 23488 : for (node *n = exps->h; n; n = n->next) {
2735 19497 : sql_exp *e = n->data;
2736 :
2737 19497 : if (e && e->card != CARD_ATOM)
2738 19469 : e->card = card;
2739 : }
2740 3991 : }
2741 :
2742 : int
2743 0 : exps_intern(list *exps)
2744 : {
2745 0 : if (exps)
2746 0 : for (node *n=exps->h; n; n = n->next) {
2747 0 : sql_exp *e = n->data;
2748 :
2749 0 : if (is_intern(e))
2750 : return 1;
2751 : }
2752 : return 0;
2753 : }
2754 :
2755 : sql_exp *
2756 3671 : exps_find_one_multi_exp(list *exps)
2757 : {
2758 3671 : sql_exp *l = NULL;
2759 3671 : int skip = 0;
2760 :
2761 : /* Find one and only 1 expression with card > CARD_ATOM */
2762 3671 : if (!list_empty(exps)) {
2763 7521 : for (node *m = exps->h ; m && !skip ; m = m->next) {
2764 3850 : sql_exp *e = m->data;
2765 :
2766 3850 : if (e->card > CARD_ATOM) {
2767 3638 : skip |= l != NULL;
2768 3638 : l = e;
2769 : }
2770 : }
2771 : }
2772 3671 : if (skip)
2773 4 : l = NULL;
2774 3671 : return l;
2775 : }
2776 :
2777 : const char *
2778 127058 : compare_func( comp_type t, int anti )
2779 : {
2780 127058 : switch(t) {
2781 73253 : case cmp_equal:
2782 73253 : return anti?"<>":"=";
2783 7979 : case cmp_lt:
2784 7979 : return anti?">":"<";
2785 2093 : case cmp_lte:
2786 2093 : return anti?">=":"<=";
2787 1130 : case cmp_gte:
2788 1130 : return anti?"<=":">=";
2789 30632 : case cmp_gt:
2790 30632 : return anti?"<":">";
2791 11971 : case cmp_notequal:
2792 11971 : return anti?"=":"<>";
2793 : default:
2794 : return NULL;
2795 : }
2796 : }
2797 :
2798 : int
2799 9524221 : is_identity( sql_exp *e, sql_rel *r)
2800 : {
2801 9533688 : switch(e->type) {
2802 33299 : case e_column:
2803 33299 : if (r && is_project(r->op)) {
2804 11989 : sql_exp *re = NULL;
2805 11989 : if (e->l)
2806 11928 : re = exps_bind_column2(r->exps, e->l, e->r, NULL);
2807 11989 : if (!re && has_label(e))
2808 263 : re = exps_bind_column(r->exps, e->r, NULL, NULL, 1);
2809 2522 : if (re)
2810 9467 : return is_identity(re, r->l);
2811 : }
2812 : return 0;
2813 9494944 : case e_func: {
2814 9494944 : sql_subfunc *f = e->f;
2815 9494944 : return !f->func->s && strcmp(f->func->base.name, "identity") == 0;
2816 : }
2817 : default:
2818 : return 0;
2819 : }
2820 : }
2821 :
2822 : list *
2823 90 : exps_alias(mvc *sql, list *exps)
2824 : {
2825 90 : list *nl = new_exp_list(sql->sa);
2826 :
2827 90 : if (exps)
2828 458 : for (node *n = exps->h; n; n = n->next) {
2829 368 : sql_exp *e = n->data, *ne;
2830 :
2831 368 : assert(exp_name(e));
2832 368 : ne = exp_ref(sql, e);
2833 368 : append(nl, ne);
2834 : }
2835 90 : return nl;
2836 : }
2837 :
2838 : list *
2839 56919 : exps_copy(mvc *sql, list *exps)
2840 : {
2841 56919 : list *nl;
2842 :
2843 56919 : if (mvc_highwater(sql))
2844 0 : return sql_error(sql, 10, SQLSTATE(42000) "Query too complex: running out of stack space");
2845 :
2846 56919 : if (!exps)
2847 : return NULL;
2848 51146 : nl = new_exp_list(sql->sa);
2849 133644 : for (node *n = exps->h; n; n = n->next) {
2850 82498 : sql_exp *arg = n->data;
2851 :
2852 82498 : arg = exp_copy(sql, arg);
2853 82498 : if (!arg)
2854 : return NULL;
2855 82498 : append(nl, arg);
2856 : }
2857 : return nl;
2858 : }
2859 :
2860 : sql_exp *
2861 264143 : exp_copy(mvc *sql, sql_exp * e)
2862 : {
2863 264143 : sql_exp *l, *r, *r2, *ne = NULL;
2864 :
2865 264143 : if (mvc_highwater(sql))
2866 0 : return sql_error(sql, 10, SQLSTATE(42000) "Query too complex: running out of stack space");
2867 :
2868 264143 : if (!e)
2869 : return NULL;
2870 264143 : switch(e->type){
2871 97653 : case e_column:
2872 97653 : ne = exp_column(sql->sa, e->l, e->r, exp_subtype(e), e->card, has_nil(e), is_unique(e), is_intern(e));
2873 97653 : ne->flag = e->flag;
2874 97653 : break;
2875 30268 : case e_cmp:
2876 30268 : if (e->flag == cmp_or || e->flag == cmp_filter) {
2877 3299 : list *l = exps_copy(sql, e->l);
2878 3299 : list *r = exps_copy(sql, e->r);
2879 :
2880 3299 : if (e->flag == cmp_filter)
2881 605 : ne = exp_filter(sql->sa, l, r, e->f, is_anti(e));
2882 : else
2883 2694 : ne = exp_or(sql->sa, l, r, is_anti(e));
2884 26969 : } else if (e->flag == cmp_in || e->flag == cmp_notin) {
2885 1104 : sql_exp *l = exp_copy(sql, e->l);
2886 1104 : list *r = exps_copy(sql, e->r);
2887 :
2888 1104 : ne = exp_in(sql->sa, l, r, e->flag);
2889 : } else {
2890 25865 : l = exp_copy(sql, e->l);
2891 25865 : r = exp_copy(sql, e->r);
2892 :
2893 25865 : if (e->f) {
2894 632 : r2 = exp_copy(sql, e->f);
2895 632 : ne = exp_compare2(sql->sa, l, r, r2, e->flag, is_symmetric(e));
2896 : } else {
2897 25233 : ne = exp_compare(sql->sa, l, r, e->flag);
2898 : }
2899 : }
2900 : break;
2901 3404 : case e_convert:
2902 3404 : ne = exp_convert(sql->sa, exp_copy(sql, e->l), exp_fromtype(e), exp_totype(e));
2903 3404 : break;
2904 9451 : case e_aggr:
2905 : case e_func: {
2906 9451 : list *l = exps_copy(sql, e->l);
2907 :
2908 9451 : if (e->type == e_func)
2909 7948 : ne = exp_op(sql->sa, l, e->f);
2910 : else
2911 1503 : ne = exp_aggr(sql->sa, l, e->f, need_distinct(e), need_no_nil(e), e->card, has_nil(e));
2912 9451 : if (e->r) { /* copy obe and gbe lists */
2913 1 : list *er = (list*) e->r;
2914 1 : assert(list_length(er) <= 2);
2915 1 : if (list_length(er) == 2)
2916 0 : ne->r = list_append(list_append(sa_list(sql->sa), exps_copy(sql, er->h->data)), exps_copy(sql, er->h->next->data));
2917 : else
2918 1 : ne->r = list_append(sa_list(sql->sa), exps_copy(sql, er->h->data));
2919 : }
2920 : break;
2921 : }
2922 123363 : case e_atom:
2923 123363 : if (e->l)
2924 119701 : ne = exp_atom(sql->sa, e->l);
2925 3662 : else if (e->r) {
2926 3605 : sql_var_name *vname = (sql_var_name*) e->r;
2927 3605 : ne = exp_param_or_declared(sql->sa, vname->sname, vname->name, &e->tpe, e->flag);
2928 57 : } else if (e->f)
2929 3 : ne = exp_values(sql->sa, exps_copy(sql, e->f));
2930 : else
2931 54 : ne = exp_atom_ref(sql->sa, e->flag, &e->tpe);
2932 : break;
2933 4 : case e_psm:
2934 4 : if (e->flag & PSM_SET) {
2935 0 : ne = exp_set(sql->sa, e->alias.rname, e->alias.name, exp_copy(sql, e->l), GET_PSM_LEVEL(e->flag));
2936 4 : } else if (e->flag & PSM_VAR) {
2937 0 : if (e->f)
2938 0 : ne = exp_table(sql->sa, e->alias.name, e->f, GET_PSM_LEVEL(e->flag));
2939 : else
2940 0 : ne = exp_var(sql->sa, e->alias.rname, e->alias.name, &e->tpe, GET_PSM_LEVEL(e->flag));
2941 4 : } else if (e->flag & PSM_RETURN) {
2942 0 : ne = exp_return(sql->sa, exp_copy(sql, e->l), GET_PSM_LEVEL(e->flag));
2943 4 : } else if (e->flag & PSM_WHILE) {
2944 0 : ne = exp_while(sql->sa, exp_copy(sql, e->l), exps_copy(sql, e->r));
2945 4 : } else if (e->flag & PSM_IF) {
2946 0 : ne = exp_if(sql->sa, exp_copy(sql, e->l), exps_copy(sql, e->r), exps_copy(sql, e->f));
2947 4 : } else if (e->flag & PSM_REL) {
2948 4 : return exp_ref(sql, e);
2949 0 : } else if (e->flag & PSM_EXCEPTION) {
2950 0 : ne = exp_exception(sql->sa, exp_copy(sql, e->l), (const char *) e->r);
2951 : }
2952 : break;
2953 : }
2954 264139 : if (!ne)
2955 0 : return ne;
2956 264139 : if (e->alias.name)
2957 136756 : exp_prop_alias(sql->sa, ne, e);
2958 264139 : ne = exp_propagate(sql->sa, ne, e);
2959 264139 : if (is_freevar(e))
2960 8142 : set_freevar(ne, is_freevar(e)-1);
2961 : return ne;
2962 : }
2963 :
2964 : /* scaling for the division operator */
2965 : static sql_exp *
2966 2558 : exp_scale_algebra(mvc *sql, sql_subfunc *f, sql_rel *rel, sql_exp *l, sql_exp *r)
2967 : {
2968 2558 : sql_subtype *lt = exp_subtype(l);
2969 2558 : sql_subtype *rt = exp_subtype(r);
2970 :
2971 2558 : if (lt->type->scale == SCALE_FIX && (lt->scale || rt->scale) &&
2972 340 : strcmp(sql_func_imp(f->func), "/") == 0) {
2973 171 : sql_subtype *res = f->res->h->data;
2974 171 : unsigned int scale, digits, digL, scaleL;
2975 171 : sql_subtype nlt;
2976 :
2977 : /* scale fixing may require a larger type ! */
2978 : /* TODO make '3' setable by user (division_minimal_scale or so) */
2979 171 : scaleL = (lt->scale < 3) ? 3 : lt->scale;
2980 171 : scaleL += (scaleL < rt->scale)?(rt->scale - scaleL):0;
2981 171 : scale = scaleL;
2982 171 : scaleL += rt->scale;
2983 171 : digL = lt->digits + (scaleL - lt->scale);
2984 171 : digits = (digL > rt->digits) ? digL : rt->digits;
2985 :
2986 : /* HACK alert: digits should be less than max */
2987 : #ifdef HAVE_HGE
2988 171 : if (res->type->radix == 10 && digits > 38)
2989 171 : digits = 38;
2990 171 : if (res->type->radix == 2 && digits > 127)
2991 171 : digits = 127;
2992 : #else
2993 : if (res->type->radix == 10 && digits > 18)
2994 : digits = 18;
2995 : if (res->type->radix == 2 && digits > 63)
2996 : digits = 63;
2997 : #endif
2998 :
2999 171 : sql_find_subtype(&nlt, lt->type->base.name, digL, scaleL);
3000 171 : if (nlt.digits < scaleL)
3001 2 : return sql_error(sql, 01, SQLSTATE(42000) "Scale (%d) overflows type", scaleL);
3002 169 : l = exp_check_type(sql, &nlt, rel, l, type_equal);
3003 :
3004 169 : sql_find_subtype(res, lt->type->base.name, digits, scale);
3005 2387 : } else if (lt->type->scale == SCALE_FIX) {
3006 2196 : sql_subtype *res = f->res->h->data;
3007 2196 : if (res->type->eclass == EC_NUM)
3008 2183 : res->digits = MAX(lt->digits, rt->digits);
3009 : }
3010 : return l;
3011 : }
3012 :
3013 : sql_exp *
3014 2558 : exps_scale_algebra(mvc *sql, sql_subfunc *f, sql_rel *rel, list *exps)
3015 : {
3016 2558 : if (list_length(exps) != 2)
3017 : return NULL;
3018 2558 : sql_exp *e = exp_scale_algebra(sql, f, rel, exps->h->data, exps->h->next->data);
3019 2558 : if (e)
3020 2556 : exps->h->data = e;
3021 : return e;
3022 : }
3023 :
3024 : void
3025 183089 : exps_digits_add(sql_subfunc *f, list *exps)
3026 : {
3027 : /* concat and friends need larger results */
3028 183089 : if (!f->func->res)
3029 : return;
3030 183089 : int digits = 0;
3031 326579 : for(node *n = exps->h; n; n = n->next) {
3032 267092 : sql_subtype *t = exp_subtype(n->data);
3033 :
3034 267092 : if (!t->digits) {
3035 : digits = 0;
3036 : break;
3037 : }
3038 143490 : digits += t->digits;
3039 : }
3040 183089 : sql_subtype *res = f->res->h->data;
3041 183089 : res->digits = digits;
3042 : }
3043 :
3044 : void
3045 24569 : exps_sum_scales(sql_subfunc *f, list *exps)
3046 : {
3047 : /* sum scales and digits for multiply operation */
3048 24569 : sql_arg *ares = f->func->res->h->data;
3049 :
3050 24569 : if (ares->type.type->scale == SCALE_FIX && strcmp(sql_func_imp(f->func), "*") == 0) {
3051 23581 : unsigned int digits = 0, scale = 0;
3052 23581 : sql_type *largesttype = ares->type.type;
3053 :
3054 70743 : for(node *n = exps->h; n; n = n->next) {
3055 47162 : sql_exp *e = n->data;
3056 47162 : sql_subtype *t = exp_subtype(e);
3057 :
3058 47162 : scale += t->scale;
3059 47162 : digits += t->digits;
3060 47162 : if (largesttype->localtype < t->type->localtype)
3061 0 : largesttype = t->type;
3062 : }
3063 23581 : sql_subtype *res = f->res->h->data;
3064 :
3065 23581 : res->scale = scale;
3066 23581 : res->digits = digits;
3067 :
3068 : /* HACK alert: digits should be less than max */
3069 : #ifdef HAVE_HGE
3070 23581 : if (ares->type.type->radix == 10 && res->digits > 38) {
3071 2414 : res->digits = 38;
3072 2414 : res->scale = MIN(res->scale, res->digits - 1);
3073 : }
3074 23581 : if (ares->type.type->radix == 2 && res->digits > 127) {
3075 24 : res->digits = 127;
3076 24 : res->scale = MIN(res->scale, res->digits - 1);
3077 : }
3078 : #else
3079 : if (ares->type.type->radix == 10 && res->digits > 18) {
3080 : res->digits = 18;
3081 : res->scale = MIN(res->scale, res->digits - 1);
3082 : }
3083 : if (ares->type.type->radix == 2 && res->digits > 63) {
3084 : res->digits = 63;
3085 : res->scale = MIN(res->scale, res->digits - 1);
3086 : }
3087 : #endif
3088 :
3089 23581 : sql_subtype t;
3090 : /* numeric types are fixed length */
3091 23581 : if (ares->type.type->eclass == EC_NUM) {
3092 : #ifdef HAVE_HGE
3093 20879 : if (ares->type.type->localtype == TYPE_hge && res->digits == 127)
3094 24 : t = *sql_bind_localtype("hge");
3095 : else
3096 : #endif
3097 20855 : if (ares->type.type->localtype == TYPE_lng && res->digits == 63)
3098 3 : t = *sql_bind_localtype("lng");
3099 20852 : else if (res->type->digits >= res->digits)
3100 8753 : t = *res; /* we cannot reduce types! */
3101 : else
3102 12099 : sql_find_numeric(&t, ares->type.type->localtype, res->digits);
3103 : } else {
3104 2702 : if (res->digits > largesttype->digits)
3105 216 : sql_find_subtype(&t, largesttype->base.name, res->digits, res->scale);
3106 : else
3107 2486 : sql_init_subtype(&t, largesttype, res->digits, res->scale);
3108 : }
3109 23581 : *res = t;
3110 : }
3111 24569 : }
3112 :
3113 : void
3114 110404 : exps_max_bits(sql_subfunc *f, list *exps)
3115 : {
3116 : /* + and - have max_bits + 1 */
3117 110404 : if (!f->func->res)
3118 : return;
3119 110404 : unsigned int digits = 0;
3120 331214 : for(node *n = exps->h; n; n = n->next) {
3121 220809 : sql_subtype *t = exp_subtype(n->data);
3122 :
3123 220810 : if (!t)
3124 0 : continue;
3125 220810 : if (digits < t->digits)
3126 220810 : digits = t->digits;
3127 : }
3128 : /* + and - (because of negative numbers) could need one extra bit (or digit) */
3129 110405 : digits += 1;
3130 110405 : sql_subtype *res = f->res->h->data;
3131 110405 : if (digits > res->type->digits)
3132 47060 : res = sql_find_numeric(res, res->type->localtype, digits);
3133 : else
3134 63345 : res->digits = digits;
3135 : }
3136 :
3137 : void
3138 18852 : exps_inout(sql_subfunc *f, list *exps)
3139 : {
3140 : /* output == first input */
3141 18852 : if (!f->func->res)
3142 : return;
3143 18852 : sql_subtype *res = f->res->h->data;
3144 18852 : bool is_decimal = (res->type->eclass == EC_DEC);
3145 18852 : unsigned int digits = 0, scale = 0;
3146 18852 : sql_type *largesttype = NULL;
3147 18852 : for(node *n = exps->h; n; n = n->next) {
3148 18852 : sql_subtype *t = exp_subtype(n->data);
3149 :
3150 18852 : if (!t)
3151 0 : continue;
3152 :
3153 18852 : if (is_decimal && t->type->eclass == EC_DEC && (!largesttype || largesttype->localtype < t->type->localtype))
3154 380 : largesttype = t->type;
3155 380 : if (is_decimal && t->type->eclass == EC_NUM) {
3156 0 : unsigned int d = bits2digits(t->digits);
3157 0 : digits = d>digits?d:digits;
3158 18852 : } else if (digits < t->digits)
3159 : digits = t->digits;
3160 18852 : if (scale < t->scale)
3161 : scale = t->scale;
3162 : break;
3163 : }
3164 18852 : if (digits > res->digits || scale > res->scale) {
3165 9088 : if (largesttype)
3166 366 : sql_init_subtype(res, largesttype, digits, scale);
3167 : else
3168 8722 : sql_find_subtype(res, res->type->base.name, digits, scale);
3169 : } else
3170 9764 : res->digits = digits;
3171 : }
3172 :
3173 : /* for aggregates we can reduce the result types size based on real digits/bits used number of known input rows */
3174 : void
3175 8982 : exps_largest_int(sql_subfunc *f, list *exps, lng cnt)
3176 : {
3177 8982 : if (!f->func->res || cnt == 0)
3178 : return;
3179 514 : sql_subtype *res = f->res->h->data;
3180 514 : if (res->type->eclass != EC_DEC && res->type->eclass != EC_NUM)
3181 : return;
3182 440 : bool is_decimal = (res->type->eclass == EC_DEC);
3183 440 : unsigned int digits = 0, scale = 0, mdigits = is_decimal ? decimal_digits(cnt) : number_bits(cnt);
3184 440 : sql_type *largesttype = NULL;
3185 440 : for(node *n = exps->h; n; n = n->next) {
3186 440 : sql_subtype *t = exp_subtype(n->data);
3187 :
3188 440 : if (!t)
3189 0 : continue;
3190 :
3191 440 : largesttype = t->type;
3192 440 : if (is_decimal && t->type->eclass == EC_NUM) {
3193 0 : unsigned int d = bits2digits(t->digits);
3194 0 : digits = d>digits?d:digits;
3195 440 : } else if (digits < t->digits)
3196 : digits = t->digits;
3197 440 : if (scale < t->scale)
3198 : scale = t->scale;
3199 : break;
3200 : }
3201 440 : digits += mdigits;
3202 440 : if (largesttype && digits <= largesttype->digits)
3203 379 : sql_init_subtype(res, largesttype, digits, scale);
3204 61 : else if (is_decimal)
3205 8 : sql_find_subtype(res, res->type->base.name, digits, scale);
3206 : else
3207 53 : sql_find_numeric(res, 1, digits);
3208 : }
3209 :
3210 : #define is_addition(fname) (strcmp(fname, "sql_add") == 0)
3211 : #define is_subtraction(fname) (strcmp(fname, "sql_sub") == 0)
3212 : void
3213 271105 : exps_scale_fix(sql_subfunc *f, list *exps, sql_subtype *atp)
3214 : {
3215 271105 : if (!f->func->res)
3216 : return;
3217 :
3218 271105 : sql_subtype *res = f->res->h->data;
3219 271105 : if (res->type->eclass != EC_ANY && res->type->eclass != EC_DEC)
3220 : return;
3221 :
3222 62155 : unsigned int digits = 0, scale = 0;
3223 62155 : sql_type *largesttype = NULL;
3224 241719 : for(node *n = exps->h; n; n = n->next) {
3225 179564 : sql_subtype *t = exp_subtype(n->data);
3226 :
3227 179564 : if (!t)
3228 0 : continue;
3229 179564 : if (digits < t->digits)
3230 : digits = t->digits;
3231 179564 : if (scale < t->scale)
3232 : scale = t->scale;
3233 179564 : if (t->type->eclass == EC_DEC && (!largesttype || largesttype->localtype < t->type->localtype))
3234 179564 : largesttype = t->type;
3235 : }
3236 62155 : res->scale = scale;
3237 62155 : if (res->type->eclass == EC_DEC)
3238 647 : digits += (is_addition(f->func->base.name) || is_subtraction(f->func->base.name));
3239 62155 : if (digits > res->type->digits) {
3240 61831 : if (largesttype && largesttype->localtype > res->type->localtype)
3241 80 : sql_init_subtype(res, largesttype, digits, scale);
3242 : else
3243 61751 : sql_find_subtype(res, res->type->localtype?res->type->base.name:atp->type->base.name, digits, scale);
3244 324 : } else if (res->type->eclass == EC_DEC || res->type->eclass == EC_NUM)
3245 253 : res->digits = digits;
3246 : }
3247 :
3248 : int
3249 129122 : exp_aggr_is_count(sql_exp *e)
3250 : {
3251 129122 : if (e->type == e_aggr && !((sql_subfunc *)e->f)->func->s && strcmp(((sql_subfunc *)e->f)->func->base.name, "count") == 0)
3252 37955 : return 1;
3253 : return 0;
3254 : }
3255 :
3256 : list *
3257 64801 : check_distinct_exp_names(mvc *sql, list *exps)
3258 : {
3259 64801 : list *distinct_exps = NULL;
3260 64801 : bool duplicates = false;
3261 :
3262 64801 : if (list_length(exps) < 2) {
3263 : return exps; /* always true */
3264 63228 : } else if (list_length(exps) < 5) {
3265 14167 : distinct_exps = list_distinct(exps, (fcmp) exp_equal, (fdup) NULL);
3266 : } else { /* for longer lists, use hashing */
3267 49061 : sql_hash *ht = hash_new(sql->ta, list_length(exps), (fkeyvalue)&exp_key);
3268 :
3269 479861 : for (node *n = exps->h; n && !duplicates; n = n->next) {
3270 430800 : sql_exp *e = n->data;
3271 430800 : int key = ht->key(e);
3272 430801 : sql_hash_e *he = ht->buckets[key&(ht->size-1)];
3273 :
3274 553826 : for (; he && !duplicates; he = he->chain) {
3275 123021 : sql_exp *f = he->value;
3276 :
3277 123021 : if (!exp_equal(e, f))
3278 1 : duplicates = true;
3279 : }
3280 430805 : hash_add(ht, key, e);
3281 : }
3282 : }
3283 63228 : if ((distinct_exps && list_length(distinct_exps) != list_length(exps)) || duplicates)
3284 4 : return NULL;
3285 : return exps;
3286 : }
3287 :
3288 : static int rel_find_parameter(mvc *sql, sql_subtype *type, sql_rel *rel, const char *relname, const char *expname);
3289 :
3290 : static int
3291 1633 : set_exp_type(mvc *sql, sql_subtype *type, sql_rel *rel, sql_exp *e)
3292 : {
3293 1639 : if (mvc_highwater(sql)) {
3294 0 : (void) sql_error(sql, 10, SQLSTATE(42000) "Query too complex: running out of stack space");
3295 0 : return -1;
3296 : }
3297 1639 : if (e->type == e_column) {
3298 60 : const char *nrname = (const char*) e->l, *nename = (const char*) e->r;
3299 : /* find all the column references and set the type */
3300 60 : e->tpe = *type;
3301 60 : return rel_find_parameter(sql, type, rel, nrname, nename);
3302 1579 : } else if (e->type == e_atom && e->f) {
3303 25 : list *atoms = e->f;
3304 25 : if (!list_empty(atoms))
3305 61 : for (node *n = atoms->h; n; n = n->next)
3306 36 : if (set_exp_type(sql, type, rel, n->data) < 0) /* set recursively */
3307 : return -1;
3308 25 : e->tpe = *type;
3309 25 : return 1; /* on a list of atoms, everything should be found */
3310 1554 : } else if (e->type == e_atom && !e->l && !e->r && !e->f) {
3311 1548 : e->tpe = *type;
3312 1548 : return set_type_param(sql, type, e->flag) == 0 ? 1 : 0;
3313 6 : } else if (exp_is_rel(e)) { /* for relation expressions, restart cycle */
3314 6 : rel = (sql_rel*) e->l;
3315 : /* limiting to these cases */
3316 6 : if (!is_project(rel->op) || list_length(rel->exps) != 1)
3317 0 : return 0;
3318 6 : sql_exp *re = rel->exps->h->data;
3319 :
3320 6 : e->tpe = *type;
3321 6 : return set_exp_type(sql, type, rel, re); /* set recursively */
3322 : }
3323 : return 0;
3324 : }
3325 :
3326 : int
3327 1541 : rel_set_type_param(mvc *sql, sql_subtype *type, sql_rel *rel, sql_exp *exp, int upcast)
3328 : {
3329 1541 : if (!type || !exp || (exp->type != e_atom && exp->type != e_column && !exp_is_rel(exp)))
3330 0 : return -1;
3331 :
3332 : /* use largest numeric types */
3333 1541 : if (upcast && type->type->eclass == EC_NUM)
3334 : #ifdef HAVE_HGE
3335 8 : type = sql_bind_localtype("hge");
3336 : #else
3337 : type = sql_bind_localtype("lng");
3338 : #endif
3339 6 : else if (upcast && type->type->eclass == EC_FLT)
3340 1 : type = sql_bind_localtype("dbl");
3341 :
3342 : /* TODO we could use the sql_query* struct to set paremeters used as freevars,
3343 : but it requires to change a lot of interfaces */
3344 : /* if (is_freevar(exp))
3345 : rel = query_fetch_outer(query, is_freevar(exp)-1); */
3346 1541 : return set_exp_type(sql, type, rel, exp);
3347 : }
3348 :
3349 : /* try to do an in-place conversion
3350 : *
3351 : * in-place conversion is only possible if the exp is a variable.
3352 : * This is only done to be able to map more cached queries onto the same
3353 : * interface.
3354 : */
3355 : sql_exp *
3356 4842599 : exp_convert_inplace(mvc *sql, sql_subtype *t, sql_exp *exp)
3357 : {
3358 4842599 : atom *a, *na;
3359 :
3360 : /* exclude named variables and variable lists */
3361 4842599 : if (exp->type != e_atom || exp->r /* named */ || exp->f /* list */ || !exp->l /* not direct atom */)
3362 : return NULL;
3363 :
3364 2714141 : a = exp->l;
3365 2714141 : if (!a->isnull && t->scale && t->type->eclass != EC_FLT)
3366 : return NULL;
3367 :
3368 2709000 : if ((na = atom_cast(sql->sa, a, t))) {
3369 2705951 : exp->l = na;
3370 2705951 : return exp;
3371 : }
3372 : return NULL;
3373 : }
3374 :
3375 : sql_exp *
3376 0 : exp_numeric_supertype(mvc *sql, sql_exp *e )
3377 : {
3378 0 : sql_subtype *tp = exp_subtype(e);
3379 :
3380 0 : if (tp->type->eclass == EC_DEC) {
3381 0 : sql_subtype *dtp = sql_bind_localtype("dbl");
3382 :
3383 0 : return exp_check_type(sql, dtp, NULL, e, type_cast);
3384 : }
3385 0 : if (tp->type->eclass == EC_NUM) {
3386 : #ifdef HAVE_HGE
3387 0 : sql_subtype *ltp = sql_bind_localtype("hge");
3388 : #else
3389 : sql_subtype *ltp = sql_bind_localtype("lng");
3390 : #endif
3391 :
3392 0 : return exp_check_type(sql, ltp, NULL, e, type_cast);
3393 : }
3394 : return e;
3395 : }
3396 :
3397 : sql_exp *
3398 4841759 : exp_check_type(mvc *sql, sql_subtype *t, sql_rel *rel, sql_exp *exp, check_type tpe)
3399 : {
3400 4841759 : int c, err = 0;
3401 4841759 : sql_exp* nexp = NULL;
3402 4841759 : sql_subtype *fromtype = exp_subtype(exp);
3403 :
3404 4842085 : if ((!fromtype || !fromtype->type) && rel_set_type_param(sql, t, rel, exp, 0) == 0)
3405 : return exp;
3406 :
3407 : /* first try cheap internal (in-place) conversions ! */
3408 4842084 : if ((nexp = exp_convert_inplace(sql, t, exp)) != NULL)
3409 : return nexp;
3410 :
3411 2136177 : if (fromtype && subtype_cmp(t, fromtype) != 0) {
3412 251255 : if (EC_INTERVAL(fromtype->type->eclass) && (t->type->eclass == EC_NUM || t->type->eclass == EC_POS) && t->digits < fromtype->digits) {
3413 : err = 1; /* conversion from interval to num depends on the number of digits */
3414 : } else {
3415 251255 : c = sql_type_convert(fromtype->type->eclass, t->type->eclass);
3416 251255 : if (!c || (c == 2 && tpe == type_set) || (c == 3 && tpe != type_cast)) {
3417 : err = 1;
3418 : } else {
3419 250741 : exp = exp_convert(sql->sa, exp, fromtype, t);
3420 : }
3421 : }
3422 : }
3423 250741 : if (err) {
3424 514 : const char *name = (exp->type == e_column && !has_label(exp)) ? exp_name(exp) : "%";
3425 576 : sql_exp *res = sql_error( sql, 03, SQLSTATE(42000) "types %s(%u,%u) and %s(%u,%u) are not equal%s%s%s",
3426 514 : fromtype->type->base.name,
3427 : fromtype->digits,
3428 : fromtype->scale,
3429 514 : t->type->base.name,
3430 : t->digits,
3431 : t->scale,
3432 : (name[0] != '%' ? " for column '" : ""),
3433 : (name[0] != '%' ? name : ""),
3434 514 : (name[0] != '%' ? "'" : "")
3435 : );
3436 514 : return res;
3437 : }
3438 : return exp;
3439 : }
3440 :
3441 : sql_exp *
3442 6624 : exp_values_set_supertype(mvc *sql, sql_exp *values, sql_subtype *opt_super)
3443 : {
3444 6624 : assert(is_values(values));
3445 6624 : list *vals = exp_get_values(values), *nexps;
3446 6624 : sql_subtype *tpe = opt_super?opt_super:exp_subtype(vals->h->data);
3447 :
3448 6624 : if (!opt_super && tpe)
3449 6525 : values->tpe = *tpe;
3450 :
3451 29325 : for (node *m = vals->h; m; m = m->next) {
3452 22701 : sql_exp *e = m->data;
3453 22701 : sql_subtype super, *ttpe;
3454 :
3455 : /* if the expression is a parameter set its type */
3456 22701 : if (tpe && e->type == e_atom && !e->l && !e->r && !e->f && !e->tpe.type) {
3457 4 : if (set_type_param(sql, tpe, e->flag) == 0)
3458 4 : e->tpe = *tpe;
3459 : else
3460 0 : return NULL;
3461 : }
3462 22701 : ttpe = exp_subtype(e);
3463 22701 : if (tpe && ttpe) {
3464 22649 : supertype(&super, ttpe, tpe);
3465 22649 : values->tpe = super;
3466 22649 : tpe = &values->tpe;
3467 : } else {
3468 : tpe = ttpe;
3469 : }
3470 : }
3471 :
3472 6624 : if (tpe) {
3473 : /* if the expression is a parameter set its type */
3474 29239 : for (node *m = vals->h; m; m = m->next) {
3475 22653 : sql_exp *e = m->data;
3476 22653 : if (e->type == e_atom && !e->l && !e->r && !e->f && !e->tpe.type) {
3477 1 : if (set_type_param(sql, tpe, e->flag) == 0)
3478 1 : e->tpe = *tpe;
3479 : else
3480 : return NULL;
3481 : }
3482 : }
3483 6586 : values->tpe = *tpe;
3484 6586 : nexps = sa_list(sql->sa);
3485 29234 : for (node *m = vals->h; m; m = m->next) {
3486 22651 : sql_exp *e = m->data;
3487 22651 : e = exp_check_type(sql, &values->tpe, NULL, e, type_equal);
3488 22651 : if (!e)
3489 : return NULL;
3490 22648 : exp_label(sql->sa, e, ++sql->label);
3491 22648 : append(nexps, e);
3492 : }
3493 6583 : values->f = nexps;
3494 : }
3495 : return values;
3496 : }
3497 :
3498 : /* return -1 on error, 0 not found, 1 found */
3499 : static int
3500 86 : rel_find_parameter(mvc *sql, sql_subtype *type, sql_rel *rel, const char *relname, const char *expname)
3501 : {
3502 138 : int res = 0;
3503 :
3504 138 : if (mvc_highwater(sql)) {
3505 0 : (void) sql_error(sql, 10, SQLSTATE(42000) "Query too complex: running out of stack space");
3506 0 : return -1;
3507 : }
3508 138 : if (!rel)
3509 : return 0;
3510 :
3511 135 : const char *nrname = relname, *nename = expname;
3512 135 : if (is_project(rel->op) && !list_empty(rel->exps)) {
3513 111 : sql_exp *e = NULL;
3514 :
3515 111 : if (nrname && nename) { /* find the column reference and propagate type setting */
3516 111 : e = exps_bind_column2(rel->exps, nrname, nename, NULL);
3517 0 : } else if (nename) {
3518 0 : e = exps_bind_column(rel->exps, nename, NULL, NULL, 1);
3519 : }
3520 111 : if (!e)
3521 3 : return 0; /* not found */
3522 108 : if (is_mset(rel->op)) { /* TODO for set relations this needs further improvement */
3523 0 : (void) sql_error(sql, 10, SQLSTATE(42000) "Cannot set parameter types under set relations at the moment");
3524 0 : return -1;
3525 : }
3526 : /* set order by column types */
3527 108 : if (is_simple_project(rel->op) && !list_empty(rel->r)) {
3528 0 : sql_exp *ordere = NULL;
3529 0 : if (nrname && nename) {
3530 0 : ordere = exps_bind_column2(rel->r, nrname, nename, NULL);
3531 0 : } else if (nename) {
3532 0 : ordere = exps_bind_column(rel->r, nename, NULL, NULL, 1);
3533 : }
3534 0 : if (ordere && ordere->type == e_column)
3535 0 : ordere->tpe = *type;
3536 : }
3537 108 : if (e->type == e_column) {
3538 52 : nrname = (const char*) e->l;
3539 52 : nename = (const char*) e->r;
3540 52 : e->tpe = *type;
3541 52 : res = 1; /* found */
3542 56 : } else if ((e->type == e_atom || exp_is_rel(e)) && (res = set_exp_type(sql, type, rel, e)) <= 0) {
3543 : return res; /* don't search further */
3544 : }
3545 : /* group by columns can have aliases! */
3546 108 : if (is_groupby(rel->op) && !list_empty(rel->r)) {
3547 0 : if (nrname && nename) {
3548 0 : e = exps_bind_column2(rel->r, nrname, nename, NULL);
3549 0 : } else if (nename) {
3550 0 : e = exps_bind_column(rel->r, nename, NULL, NULL, 1);
3551 : }
3552 0 : if (!e)
3553 : return res; /* don't search further */
3554 0 : if (e->type == e_column) {
3555 0 : nrname = (const char*) e->l;
3556 0 : nename = (const char*) e->r;
3557 0 : e->tpe = *type;
3558 0 : } else if ((e->type == e_atom || exp_is_rel(e)) && (res = set_exp_type(sql, type, rel, e)) <= 0) {
3559 : return res; /* don't search further */
3560 : }
3561 : }
3562 108 : if (e->type != e_column)
3563 : return res; /* don't search further */
3564 : }
3565 :
3566 76 : switch (rel->op) {
3567 14 : case op_join:
3568 : case op_left:
3569 : case op_right:
3570 : case op_full:
3571 14 : if (rel->l)
3572 14 : res = rel_find_parameter(sql, type, rel->l, nrname, nename);
3573 14 : if (rel->r && res <= 0) { /* try other relation if not found */
3574 12 : int err = sql->session->status, lres = res;
3575 12 : char buf[ERRSIZE];
3576 :
3577 12 : strcpy(buf, sql->errstr); /* keep error found and try other join relation */
3578 12 : sql->session->status = 0;
3579 12 : sql->errstr[0] = '\0';
3580 12 : res = rel_find_parameter(sql, type, rel->r, nrname, nename);
3581 12 : if (res == 0) { /* parameter wasn't found, set error */
3582 1 : res = lres;
3583 1 : sql->session->status = err;
3584 1 : strcpy(sql->errstr, buf);
3585 : }
3586 : }
3587 : break;
3588 52 : case op_semi:
3589 : case op_anti:
3590 : case op_groupby:
3591 : case op_project:
3592 : case op_select:
3593 : case op_topn:
3594 : case op_sample:
3595 52 : if (rel->l)
3596 : res = rel_find_parameter(sql, type, rel->l, nrname, nename);
3597 : break;
3598 0 : case op_union: /* TODO for set relations this needs further improvement */
3599 : case op_inter:
3600 : case op_except:
3601 : case op_munion: {
3602 0 : (void) sql_error(sql, 10, SQLSTATE(42000) "Cannot set parameter types under set relations at the moment");
3603 0 : return -1;
3604 : }
3605 : default: /* For table returning functions, the type must be set when the relation is created */
3606 : return 0;
3607 : }
3608 : return res;
3609 : }
3610 :
3611 : sql_exp *
3612 17599 : list_find_exp( list *exps, sql_exp *e)
3613 : {
3614 17599 : sql_exp *ne = NULL;
3615 :
3616 17599 : if (e->type != e_column)
3617 : return NULL;
3618 17559 : if (( e->l && (ne=exps_bind_column2(exps, e->l, e->r, NULL)) != NULL) ||
3619 17210 : ((!e->l && (ne=exps_bind_column(exps, e->r, NULL, NULL, 1)) != NULL)))
3620 365 : return ne;
3621 : return NULL;
3622 : }
|