You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AQuery/monetdb/msvc/sql_relation.h

302 lines
9.1 KiB

/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Copyright 1997 - July 2008 CWI, August 2008 - 2022 MonetDB B.V.
*/
#ifndef SQL_RELATION_H
#define SQL_RELATION_H
#include "sql_catalog.h"
typedef enum expression_type {
e_atom,
e_column,
e_cmp,
e_func,
e_aggr,
e_convert,
e_psm
} expression_type;
#define CARD_ATOM 1
#define CARD_AGGR 2
#define CARD_MULTI 3
typedef struct sql_exp_name {
unsigned int label;
const char *name;
const char *rname;
} sql_exp_name;
typedef struct sql_var_name {
const char *name;
const char *sname;
} sql_var_name;
typedef struct expression {
expression_type type; /* atom, cmp, func/aggr */
sql_exp_name alias;
void *l;
void *r;
void *f; /* func's and aggr's, also e_cmp may have have 2 arguments */
unsigned int flag; /* cmp types, PSM types/level */
unsigned int
card:2, /* card (0 truth value!) (1 atoms) (2 aggr) (3 multi value) */
freevar:4, /* free variable, ie binds to the upper dependent join */
intern:1,
anti:1,
ascending:1, /* order direction */
nulls_last:1, /* return null after all other rows */
zero_if_empty:1, /* in case of partial aggregator computation, some aggregators need to return 0 instead of NULL */
distinct:1,
argument_independence:1, /* for a function expression, the arguments are independent of the inner project relation. */
semantics:1, /* is vs = semantics (nil = nil vs unknown != unknown), ranges with or without nil, aggregation with or without nil */
need_no_nil:1,
has_no_nil:1,
unique:1, /* expression has unique values, but it may have multiple NULL values! */
base:1,
ref:1, /* used to indicate an other expression may reference this one */
used:1, /* used for quick dead code removal */
symmetric:1; /* compare between symmetric */
sql_subtype tpe;
void *p; /* properties for the optimizer */
} sql_exp;
#define TABLE_PROD_FUNC 1
#define TABLE_FROM_RELATION 2
#define TRIGGER_WRAPPER 4
#define IS_TABLE_PROD_FUNC(X) ((X & TABLE_PROD_FUNC) == TABLE_PROD_FUNC)
/* or-ed with the above TABLE_PROD_FUNC */
#define UPD_COMP 2
#define LEFT_JOIN 4
#define REL_PARTITION 8
#define MERGE_LEFT 16 /* used by merge statements */
#define OUTER_ZERO 32
/* We need bit wise exclusive numbers as we merge the level also in the flag */
#define PSM_SET 1
#define PSM_VAR 2
#define PSM_RETURN 4
#define PSM_WHILE 8
#define PSM_IF 16
#define PSM_REL 32
#define PSM_EXCEPTION 64
#define SET_PSM_LEVEL(level) (level<<8)
#define GET_PSM_LEVEL(level) (level>>8)
typedef enum ddl_statement {
ddl_output,
ddl_list,
ddl_psm,
ddl_exception,
ddl_create_seq,
ddl_alter_seq,
ddl_drop_seq,
ddl_alter_table_add_range_partition,
ddl_alter_table_add_list_partition,
ddl_release,
ddl_commit,
ddl_rollback,
ddl_trans,
ddl_create_schema,
ddl_drop_schema,
ddl_create_table,
ddl_drop_table,
ddl_create_view,
ddl_drop_view,
ddl_drop_constraint,
ddl_alter_table,
ddl_create_type,
ddl_drop_type,
ddl_drop_index,
ddl_create_function,
ddl_drop_function,
ddl_create_trigger,
ddl_drop_trigger,
ddl_grant_roles,
ddl_revoke_roles,
ddl_grant,
ddl_revoke,
ddl_grant_func,
ddl_revoke_func,
ddl_create_user,
ddl_drop_user,
ddl_alter_user,
ddl_rename_user,
ddl_create_role,
ddl_drop_role,
ddl_alter_table_add_table,
ddl_alter_table_del_table,
ddl_alter_table_set_access,
ddl_comment_on,
ddl_rename_schema,
ddl_rename_table,
ddl_rename_column,
ddl_maxops /* evaluated to the max value, should be always kept at the bottom */
} ddl_statement;
typedef enum operator_type {
op_basetable = 0,
op_table,
op_ddl,
op_project, /* includes order by */
op_select,
op_join,
op_left,
op_right,
op_full,
op_semi,
op_anti,
op_union,
op_inter,
op_except,
op_groupby,
op_topn,
op_sample,
op_insert, /* insert(l=table, r insert expressions) */
op_update, /* update(l=table, r update expressions) */
op_delete, /* delete(l=table, r delete expression) */
op_truncate, /* truncate(l=table) */
op_merge
} operator_type;
#define is_atom(et) (et == e_atom)
/* a simple atom is a literal or on the query stack */
#define is_simple_atom(e) (is_atom((e)->type) && !(e)->r && !(e)->f)
#define is_values(e) ((e)->type == e_atom && (e)->f)
#define is_func(et) (et == e_func)
#define is_aggr(et) (et == e_aggr)
#define is_convert(et) (et == e_convert)
#define is_map_op(et) (et == e_func || et == e_convert)
#define is_compare(et) (et == e_cmp)
#define is_column(et) (et != e_cmp)
#define is_alias(et) (et == e_column)
#define is_analytic(e) ((e)->type == e_func && ((sql_subfunc*)(e)->f)->func->type == F_ANALYTIC)
#define is_base(op) (op == op_basetable || op == op_table)
#define is_basetable(op) (op == op_basetable)
#define is_ddl(op) (op == op_ddl)
#define is_outerjoin(op) (op == op_left || op == op_right || op == op_full)
#define is_left(op) (op == op_left)
#define is_right(op) (op == op_right)
#define is_full(op) (op == op_full)
#define is_innerjoin(op) (op == op_join)
#define is_join(op) (op == op_join || is_outerjoin(op))
#define is_semi(op) (op == op_semi || op == op_anti)
#define is_joinop(op) (is_join(op) || is_semi(op))
#define is_select(op) (op == op_select)
#define is_set(op) (op == op_union || op == op_inter || op == op_except)
#define is_union(op) (op == op_union)
#define is_inter(op) (op == op_inter)
#define is_except(op) (op == op_except)
#define is_simple_project(op) (op == op_project)
#define is_project(op) (op == op_project || op == op_groupby || is_set(op))
#define is_groupby(op) (op == op_groupby)
#define is_topn(op) (op == op_topn)
#define is_modify(op) (op == op_insert || op == op_update || op == op_delete || op == op_truncate || op == op_merge)
#define is_sample(op) (op == op_sample)
#define is_insert(op) (op == op_insert)
#define is_update(op) (op == op_update)
#define is_delete(op) (op == op_delete)
#define is_truncate(op) (op == op_truncate)
#define is_merge(op) (op == op_merge)
/* ZERO on empty sets, needed for sum (of counts)). */
#define zero_if_empty(e) ((e)->zero_if_empty)
#define set_zero_if_empty(e) (e)->zero_if_empty = 1
/* NO NIL semantics of aggr operations */
#define need_no_nil(e) ((e)->need_no_nil)
#define set_no_nil(e) (e)->need_no_nil = 1
/* does the expression (possibly) have nils */
#define has_nil(e) ((e)->has_no_nil==0)
#define set_has_no_nil(e) (e)->has_no_nil = 1
#define set_has_nil(e) (e)->has_no_nil = 0
#define is_ascending(e) ((e)->ascending)
#define set_ascending(e) ((e)->ascending = 1)
#define set_descending(e) ((e)->ascending = 0)
#define nulls_last(e) ((e)->nulls_last)
#define set_nulls_last(e) ((e)->nulls_last=1)
#define set_nulls_first(e) ((e)->nulls_last=0)
#define set_direction(e, dir) ((e)->ascending = (dir&1), (e)->nulls_last = (dir&2)?1:0)
#define is_unique(e) ((e)->unique)
#define set_unique(e) (e)->unique = 1
#define set_not_unique(e) (e)->unique = 0
#define is_anti(e) ((e)->anti)
#define set_anti(e) (e)->anti = 1
#define is_semantics(e) ((e)->semantics)
#define set_semantics(e) (e)->semantics = 1
#define is_symmetric(e) ((e)->symmetric)
#define set_symmetric(e) (e)->symmetric = 1
#define is_intern(e) ((e)->intern)
#define set_intern(e) (e)->intern = 1
#define is_basecol(e) ((e)->base)
#define set_basecol(e) (e)->base = 1
#define has_label(e) ((e)->alias.label > 0)
/* used for expressions and relations */
#define need_distinct(er) ((er)->distinct)
#define set_distinct(er) (er)->distinct = 1
#define set_nodistinct(er) (er)->distinct = 0
#define is_processed(rel) ((rel)->processed)
#define set_processed(rel) (rel)->processed = 1
#define reset_processed(rel) (rel)->processed = 0
#define is_dependent(rel) ((rel)->dependent)
#define set_dependent(rel) (rel)->dependent = 1
#define reset_dependent(rel) (rel)->dependent = 0
#define is_outer(rel) ((rel)->outer)
#define set_outer(rel) (rel)->outer = 1
#define reset_outer(rel) (rel)->outer = 0
#define is_single(rel) ((rel)->single)
#define set_single(rel) (rel)->single = 1
#define reset_single(rel) (rel)->single = 0
#define is_freevar(e) ((e)->freevar)
#define set_freevar(e,level) (e)->freevar = level+1
#define reset_freevar(e) (e)->freevar = 0
#define rel_is_ref(rel) (((sql_rel*)(rel))->ref.refcnt > 1)
typedef struct relation {
sql_ref ref;
operator_type op;
void *l;
void *r;
list *exps;
int nrcols; /* nr of cols */
unsigned int
flag:16,
card:4, /* 0, 1 (row), 2 aggr, 3 */
dependent:1, /* dependent join */
distinct:1,
processed:1, /* fully processed or still in the process of building */
outer:1, /* used as outer (ungrouped) */
grouped:1, /* groupby processed all the group by exps */
single:1,
/*
* Used by rewriters at rel_unnest, rel_optimizer and rel_distribute so a relation is not modified twice
* All bits are used by rel_unnest modifiers and always reset after.
* The first bit is also used by rel_dce and rel_merge_select_rse optimizers.
* The third bit is used by rel_remote_func only and it's not reset.
*/
used:3;
void *p; /* properties for the optimizer, distribution */
} sql_rel;
#endif /* SQL_RELATION_H */