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, 2025 MonetDB Foundation; 9 : * Copyright August 2008 - 2023 MonetDB B.V.; 10 : * Copyright 1997 - July 2008 CWI. 11 : */ 12 : 13 : #ifndef _REL_REWRITER_H_ 14 : #define _REL_REWRITER_H_ 15 : 16 : #include "sql_relation.h" 17 : #include "rel_rel.h" 18 : 19 : #define is_ifthenelse_func(sf) (strcmp((sf)->func->base.name, "ifthenelse") == 0) 20 : #define is_isnull_func(sf) (strcmp((sf)->func->base.name, "isnull") == 0) 21 : #define is_isnotnull_func(sf) (strcmp((sf)->func->base.name, "isnotnull") == 0) 22 : #define is_not_func(sf) (strcmp((sf)->func->base.name, "not") == 0) 23 : #define is_caselike_func(sf) (strcmp((sf)->func->base.name, "case") == 0 || \ 24 : strcmp((sf)->func->base.name, "casewhen") == 0 || \ 25 : strcmp((sf)->func->base.name, "coalesce") == 0 || \ 26 : strcmp((sf)->func->base.name, "nullif") == 0) 27 : #define is_case_func(sf) (strcmp((sf)->func->base.name, "case") == 0) 28 : #define is_casewhen_func(sf) (strcmp((sf)->func->base.name, "casewhen") == 0) 29 : 30 : extern sql_exp *rewrite_simplify_exp(visitor *v, sql_rel *rel, sql_exp *e, int depth); 31 : extern sql_rel *rewrite_simplify(visitor *v, uint8_t cycle, bool value_based_opt, sql_rel *rel); 32 : 33 : static inline sql_rel * 34 8299387 : try_remove_empty_select(visitor *v, sql_rel *rel) 35 : { 36 8299387 : if (is_select(rel->op) && !(rel_is_ref(rel)) && list_empty(rel->exps)) { 37 56327 : sql_rel *l = rel->l; 38 56327 : rel->l = NULL; 39 56327 : rel_destroy(rel); 40 56327 : v->changes++; 41 56327 : rel = l; 42 : } 43 8299387 : return rel; 44 : } 45 : 46 : extern int find_member_pos(list *l, sql_table *t); 47 : extern sql_column *name_find_column(sql_rel *rel, sql_alias *rname, const char *name, int pnr, sql_rel **bt); 48 : 49 : extern int exp_joins_rels(sql_exp *e, list *rels); 50 : /* WARNING exps_unique doesn't check for duplicate NULL values */ 51 : extern int kc_column_cmp(sql_kc *kc, sql_column *c); 52 : extern int exps_unique(mvc *sql, sql_rel *rel, list *exps); 53 : 54 : extern sql_column *exp_find_column(sql_rel *rel, sql_exp *exp, int pnr); 55 : 56 : extern BUN get_rel_count(sql_rel *rel); 57 : extern void set_count_prop(allocator *sa, sql_rel *rel, BUN val); 58 : 59 : #endif /*_REL_REWRITER_H_*/