1/*
2 * This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 *
6 * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V.
7 */
8
9#ifndef _SQL_STATEMENT_H_
10#define _SQL_STATEMENT_H_
11
12#include "sql_mem.h"
13#include "sql_types.h"
14#include "sql_atom.h"
15#include "sql_string.h"
16#include "sql_mvc.h"
17#include "mal_backend.h"
18
19typedef union stmtdata {
20 struct atom *aval;
21 struct list *lval;
22 struct stmt *stval;
23
24 struct sql_column *cval;
25 struct sql_idx *idxval;
26 struct sql_table *tval;
27
28 sql_subtype typeval;
29 struct sql_subaggr *aggrval;
30 struct sql_subfunc *funcval;
31 sql_rel *rel;
32} stmtdata;
33
34typedef enum stmt_type {
35 st_none,
36 st_var, /* use and/or declare variable */
37
38 st_table, /* some functions return a table */
39 st_temp, /* temporal bat */
40 st_single, /* single value bat */
41 st_rs_column,
42 st_tid,
43 st_bat,
44 st_idxbat,
45 st_const,
46 st_gen_group,
47 st_mirror,
48 st_result, /* get nth result of a statement */
49
50 st_limit,
51 st_limit2,
52 st_sample,
53 st_order,
54 st_reorder,
55
56 st_output,
57 st_affected_rows,
58
59 st_atom,
60 st_uselect,
61 st_uselect2,
62 st_tunion,
63 st_tdiff,
64 st_tinter,
65
66 st_join,
67 st_join2,
68 st_joinN,
69
70 st_export,
71 st_append,
72 st_table_clear,
73 st_exception,
74 st_trans,
75 st_catalog,
76
77 st_append_col,
78 st_append_idx,
79 st_update_col,
80 st_update_idx,
81 st_delete,
82
83 st_group,
84 st_convert,
85 st_Nop,
86 st_func,
87 st_aggr,
88
89 st_alias,
90
91 /* used internally only */
92 st_list,
93
94 /* flow control statements */
95 st_cond,
96 st_control_end,
97 st_return,
98 st_assign
99} st_type;
100
101/* flag to indicate anti join/select */
102#define SWAPPED 16
103#define ANTI ANTISEL
104#define GRP_DONE 32
105
106typedef struct stmt {
107 st_type type;
108 struct stmt *op1;
109 struct stmt *op2;
110 struct stmt *op3;
111 stmtdata op4; /* only op4 will hold other types */
112
113 char nrcols;
114 char key; /* key (aka all values are unique) */ // TODO make this thing a bool
115 char aggr; /* aggregated */
116 char partition; /* selected as mitosis candidate */
117
118 int flag;
119
120 int nr; /* variable assignment */
121
122 const char *tname;
123 const char *cname;
124 InstrPtr q;
125} stmt;
126
127extern void create_merge_partitions_accumulator(backend *be);
128extern int add_to_merge_partitions_accumulator(backend *be, int nr);
129
130extern int stmt_key(stmt *s);
131
132extern stmt *stmt_none(backend *be);
133
134//#define VAR_DECLARE 1
135#define VAR_GLOBAL(f) ((f>>1)==1)
136extern stmt *stmt_var(backend *be, const char *varname, sql_subtype *t, int declare, int level);
137extern stmt *stmt_vars(backend *be, const char *varname, sql_table *t, int declare, int level);
138extern stmt *stmt_varnr(backend *be, int nr, sql_subtype *t);
139
140extern stmt *stmt_table(backend *be, stmt *cols, int temp);
141extern stmt *stmt_rs_column(backend *be, stmt *result_set, int i, sql_subtype *tpe);
142
143extern stmt *stmt_bat(backend *be, sql_column *c, int access, int partition);
144extern stmt *stmt_idxbat(backend *be, sql_idx *i, int access, int partition);
145extern stmt *stmt_tid(backend *be, sql_table *t, int partition);
146
147extern stmt *stmt_append_col(backend *be, sql_column *c, stmt *b, int locked);
148extern stmt *stmt_append_idx(backend *be, sql_idx *i, stmt *b);
149extern stmt *stmt_update_col(backend *be, sql_column *c, stmt *tids, stmt *upd);
150extern stmt *stmt_update_idx(backend *be, sql_idx *i, stmt *tids, stmt *upd);
151extern stmt *stmt_delete(backend *be, sql_table *t, stmt *b);
152
153extern stmt *stmt_append(backend *be, stmt *c, stmt *values);
154extern stmt *stmt_table_clear(backend *be, sql_table *t);
155
156extern stmt *stmt_export(backend *be, stmt *t, const char *sep, const char *rsep, const char *ssep, const char *null_string, int onclient, stmt *file);
157extern stmt *stmt_trans(backend *b, int type, stmt *chain, stmt *name);
158extern stmt *stmt_catalog(backend *be, int type, stmt *args);
159
160extern stmt *stmt_temp(backend *be, sql_subtype *t);
161extern stmt *stmt_atom(backend *be, atom *a);
162extern stmt *stmt_atom_string(backend *be, const char *s);
163extern stmt *stmt_atom_string_nil(backend *be);
164extern stmt *stmt_atom_int(backend *be, int i);
165extern stmt *stmt_atom_lng(backend *be, lng i);
166extern stmt *stmt_atom_lng_nil(backend *be);
167extern stmt *stmt_bool(backend *be, int b);
168
169extern stmt *stmt_uselect(backend *be, stmt *op1, stmt *op2, comp_type cmptype, stmt *sub, int anti);
170/* cmp
171 0 == l < x < h
172 1 == l < x <= h
173 2 == l <= x < h
174 3 == l <= x <= h
175 */
176extern stmt *stmt_uselect2(backend *be, stmt *op1, stmt *op2, stmt *op3, int cmp, stmt *sub, int anti);
177extern stmt *stmt_genselect(backend *be, stmt *lops, stmt *rops, sql_subfunc *f, stmt *sub, int anti);
178
179extern stmt *stmt_tunion(backend *be, stmt *op1, stmt *op2);
180extern stmt *stmt_tdiff(backend *be, stmt *op1, stmt *op2);
181extern stmt *stmt_tdiff2(backend *be, stmt *op1, stmt *op2);
182extern stmt *stmt_tinter(backend *be, stmt *op1, stmt *op2);
183
184extern stmt *stmt_join(backend *be, stmt *op1, stmt *op2, int anti, comp_type cmptype);
185extern stmt *stmt_join2(backend *be, stmt *l, stmt *ra, stmt *rb, int cmp, int anti, int swapped);
186/* generic join operator, with a left and right statement list */
187extern stmt *stmt_genjoin(backend *be, stmt *l, stmt *r, sql_subfunc *op, int anti, int swapped);
188
189extern stmt *stmt_project(backend *be, stmt *op1, stmt *op2);
190extern stmt *stmt_project_delta(backend *be, stmt *col, stmt *upd, stmt *ins);
191extern stmt *stmt_left_project(backend *be, stmt *op1, stmt *op2, stmt *op3);
192
193extern stmt *stmt_list(backend *be, list *l);
194extern void stmt_set_nrcols(stmt *s);
195
196extern stmt *stmt_group(backend *be, stmt *op1, stmt *grp, stmt *ext, stmt *cnt, int done);
197
198/* raise exception incase the condition (cond) holds, continue with stmt res */
199extern stmt *stmt_exception(backend *be, stmt *cond, const char *errstr, int errcode);
200
201extern stmt *stmt_const(backend *be, stmt *s, stmt *val);
202
203extern stmt *stmt_gen_group(backend *be, stmt *gids, stmt *cnts); /* given a gid,cnt blowup to full groups */
204extern stmt *stmt_mirror(backend *be, stmt *s);
205extern stmt *stmt_result(backend *be, stmt *s, int nr);
206
207/*
208 * distinct: compute topn on unique groups
209 * dir: direction of the ordering, ie 1 Ascending, 0 decending
210 * last: intermediate step or last step
211 * order: is order important or not (firstn vs slice)
212 */
213extern stmt *stmt_limit(backend *sa, stmt *c, stmt *piv, stmt *gid, stmt *offset, stmt *limit, int distinct, int dir, int nullslast, int last, int order);
214extern stmt *stmt_sample(backend *be, stmt *s, stmt *sample, stmt *seed);
215extern stmt *stmt_order(backend *be, stmt *s, int direction, int nullslast);
216extern stmt *stmt_reorder(backend *be, stmt *s, int direction, int nullslast, stmt *orderby_ids, stmt *orderby_grp);
217
218extern stmt *stmt_convert(backend *sa, stmt *v, sql_subtype *from, sql_subtype *to, stmt *sel);
219extern stmt *stmt_unop(backend *be, stmt *op1, sql_subfunc *op);
220extern stmt *stmt_binop(backend *be, stmt *op1, stmt *op2, sql_subfunc *op);
221extern stmt *stmt_Nop(backend *be, stmt *ops, sql_subfunc *op);
222extern stmt *stmt_func(backend *be, stmt *ops, const char *name, sql_rel *imp, int f_union);
223extern stmt *stmt_aggr(backend *be, stmt *op1, stmt *grp, stmt *ext, sql_subaggr *op, int reduce, int no_nil, int nil_if_empty);
224
225extern stmt *stmt_alias(backend *be, stmt *op1, const char *tname, const char *name);
226
227extern stmt *stmt_output(backend *be, stmt *l);
228extern stmt *stmt_affected_rows(backend *be, stmt *l);
229
230/* flow control statements */
231extern stmt *stmt_cond(backend *be, stmt *cond, stmt *outer, int loop, int anti);
232extern stmt *stmt_control_end(backend *be, stmt *cond);
233extern stmt *stmt_return(backend *be, stmt *val, int nr_of_declared_tables);
234extern stmt *stmt_assign(backend *be, const char *varname, stmt *val, int level);
235
236extern sql_subtype *tail_type(stmt *st);
237extern int stmt_has_null(stmt *s);
238
239extern const char *column_name(sql_allocator *sa, stmt *st);
240extern const char *table_name(sql_allocator *sa, stmt *st);
241extern const char *schema_name(sql_allocator *sa, stmt *st);
242
243extern stmt *const_column(backend *ba, stmt *val);
244extern stmt *stmt_fetch(backend *ba, stmt *val);
245
246#endif /* _SQL_STATEMENT_H_ */
247