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_mem.h"
15 : #include "sql_symbol.h"
16 : #include "sql_parser.h"
17 :
18 : static symbol *
19 11379403 : symbol_init(symbol *s, tokens token, symtype type )
20 : {
21 11379403 : s->token = token;
22 11379403 : s->type = type;
23 11379403 : return s;
24 : }
25 :
26 : symbol *
27 264644 : symbol_create(sql_allocator *sa, tokens token, char *data)
28 : {
29 264644 : symbol *s = SA_NEW(sa, symbol);
30 :
31 264644 : if (s) {
32 264644 : symbol_init(s, token, type_string);
33 264644 : s->data.sval = data;
34 : }
35 264644 : return s;
36 : }
37 :
38 : symbol *
39 8017727 : symbol_create_list(sql_allocator *sa, tokens token, dlist *data)
40 : {
41 8017727 : symbol *s = SA_NEW(sa, symbol);
42 :
43 8017723 : if (s) {
44 8017723 : symbol_init(s, token, type_list);
45 8017723 : s->data.lval = data;
46 : }
47 8017723 : return s;
48 : }
49 :
50 : symbol *
51 6171 : symbol_create_int(sql_allocator *sa, tokens token, int data)
52 : {
53 6171 : symbol *s = SA_NEW(sa, symbol);
54 :
55 6171 : if (s) {
56 6171 : symbol_init(s, token, type_int);
57 6171 : s->data.i_val = data;
58 : }
59 6171 : return s;
60 : }
61 :
62 : symbol *
63 166 : symbol_create_lng(sql_allocator *sa, tokens token, lng data)
64 : {
65 166 : symbol *s = SA_NEW(sa, symbol);
66 :
67 166 : if (s) {
68 166 : symbol_init(s, token, type_lng);
69 166 : s->data.l_val = data;
70 : }
71 166 : return s;
72 : }
73 :
74 : symbol *
75 100816 : symbol_create_symbol(sql_allocator *sa, tokens token, symbol *data)
76 : {
77 100816 : symbol *s = SA_NEW(sa, symbol);
78 :
79 100816 : if (s) {
80 100816 : symbol_init(s, token, type_symbol);
81 100816 : s->data.sym = data;
82 : }
83 100816 : return s;
84 : }
85 :
86 : static dnode *
87 30081034 : dnode_create(sql_allocator *sa )
88 : {
89 30081034 : dnode *n = SA_NEW(sa, dnode);
90 :
91 30080544 : if (n)
92 30080544 : n->next = NULL;
93 30080544 : return n;
94 : }
95 :
96 : static dnode *
97 9295413 : dnode_create_string(sql_allocator *sa, const char *data)
98 : {
99 18590822 : dnode *n = dnode_create(sa);
100 :
101 9295409 : if (n) {
102 9295409 : n->data.sval = (char*)data;
103 9295409 : n->type = type_string;
104 : }
105 9295409 : return n;
106 : }
107 : static dnode *
108 4613025 : dnode_create_list(sql_allocator *sa, dlist *data)
109 : {
110 9226051 : dnode *n = dnode_create(sa);
111 :
112 4613026 : if (n) {
113 4613026 : n->data.lval = data;
114 4613026 : n->type = type_list;
115 : }
116 4613026 : return n;
117 : }
118 : static dnode *
119 2789206 : dnode_create_int(sql_allocator *sa, int data)
120 : {
121 5578412 : dnode *n = dnode_create(sa);
122 :
123 2789206 : if (n) {
124 2789206 : n->data.i_val = data;
125 2789206 : n->type = type_int;
126 : }
127 2789206 : return n;
128 : }
129 : static dnode *
130 2485 : dnode_create_lng(sql_allocator *sa, lng data)
131 : {
132 4970 : dnode *n = dnode_create(sa);
133 :
134 2485 : if (n) {
135 2485 : n->data.l_val = data;
136 2485 : n->type = type_lng;
137 : }
138 2485 : return n;
139 : }
140 : static dnode *
141 12355109 : dnode_create_symbol(sql_allocator *sa, symbol *data)
142 : {
143 24710241 : dnode *n = dnode_create(sa);
144 :
145 12355132 : if (n) {
146 12355132 : n->data.sym = data;
147 12355132 : n->type = type_symbol;
148 : }
149 12355132 : return n;
150 : }
151 :
152 : static dnode *
153 1026495 : dnode_create_type(sql_allocator *sa, sql_subtype *data)
154 : {
155 1026495 : dnode *n = dnode_create(sa);
156 :
157 1026495 : if (n) {
158 1026495 : if (data)
159 1026492 : n->data.typeval = *data;
160 : else
161 3 : n->data.typeval.type = NULL;
162 1026495 : n->type = type_type;
163 : }
164 1026495 : return n;
165 : }
166 :
167 : dlist *
168 12598554 : dlist_create(sql_allocator *sa)
169 : {
170 12598554 : dlist *l = SA_NEW(sa, dlist);
171 :
172 12598495 : if (l) {
173 12598495 : l->h = l->t = NULL;
174 12598495 : l->cnt = 0;
175 : }
176 12598495 : return l;
177 : }
178 :
179 : int
180 12021876 : dlist_length(dlist *l)
181 : {
182 12021876 : return l->cnt;
183 : }
184 :
185 : static dlist *
186 30081753 : dlist_append_default(dlist *l, dnode *n)
187 : {
188 30081753 : if (l->cnt) {
189 17485817 : l->t->next = n;
190 : } else {
191 12595936 : l->h = n;
192 : }
193 30081753 : l->t = n;
194 30081753 : l->cnt++;
195 30081753 : return l;
196 : }
197 :
198 : dlist *
199 9295413 : dlist_append_string(sql_allocator *sa, dlist *l, const char *data)
200 : {
201 9295413 : dnode *n = dnode_create_string(sa, data);
202 :
203 9295409 : if (!n)
204 : return NULL;
205 18590818 : return dlist_append_default(l, n);
206 : }
207 :
208 : dlist *
209 4613025 : dlist_append_list(sql_allocator *sa, dlist *l, dlist *data)
210 : {
211 4613025 : dnode *n = dnode_create_list(sa, data);
212 :
213 4613026 : if (!n)
214 : return NULL;
215 9226052 : return dlist_append_default(l, n);
216 : }
217 :
218 : dlist *
219 2789206 : dlist_append_int(sql_allocator *sa, dlist *l, int data)
220 : {
221 2789206 : dnode *n = dnode_create_int(sa, data);
222 :
223 2789206 : if (!n)
224 : return NULL;
225 5578412 : return dlist_append_default(l, n);
226 : }
227 :
228 : dlist *
229 2485 : dlist_append_lng(sql_allocator *sa, dlist *l, lng data)
230 : {
231 2485 : dnode *n = dnode_create_lng(sa, data);
232 :
233 2485 : if (!n)
234 : return NULL;
235 4970 : return dlist_append_default(l, n);
236 : }
237 :
238 : dlist *
239 12355109 : dlist_append_symbol(sql_allocator *sa, dlist *l, symbol *data)
240 : {
241 12355109 : dnode *n = dnode_create_symbol(sa, data);
242 :
243 12355132 : if (!n)
244 : return NULL;
245 24710264 : return dlist_append_default(l, n);
246 : }
247 :
248 : dlist *
249 1026495 : dlist_append_type(sql_allocator *sa, dlist *l, sql_subtype *data)
250 : {
251 1026495 : dnode *n = dnode_create_type(sa, data);
252 :
253 1026495 : if (!n)
254 : return NULL;
255 2052990 : return dlist_append_default(l, n);
256 : }
257 :
258 : symbol *
259 360322 : newSelectNode(sql_allocator *sa, int distinct, struct dlist *selection, struct dlist *into, symbol *from, symbol *where, symbol *groupby, symbol *having, symbol *orderby, symbol *name, symbol *limit, symbol *offset, symbol *sample, symbol *seed, symbol *window)
260 : {
261 360322 : SelectNode *sn = SA_NEW(sa, SelectNode);
262 360326 : symbol *s = (symbol *) sn;
263 :
264 360326 : if (s) {
265 360326 : symbol_init(s, SQL_SELECT, type_symbol);
266 360326 : sn->distinct = distinct;
267 360326 : sn->lateral = 0;
268 360326 : sn->limit = limit;
269 360326 : sn->offset = offset;
270 360326 : sn->sample = sample;
271 360326 : sn->seed = seed;
272 360326 : sn->selection = selection;
273 360326 : sn->into = into;
274 360326 : sn->from = from;
275 360326 : sn->where = where;
276 360326 : sn->groupby = groupby;
277 360326 : sn->having = having;
278 360326 : sn->orderby = orderby;
279 360326 : sn->name = name;
280 360326 : sn->window = window;
281 : }
282 360326 : return s;
283 : }
284 :
285 : symbol *
286 2629600 : newAtomNode(sql_allocator *sa, atom *data)
287 : {
288 2629600 : AtomNode *an = SA_NEW(sa, AtomNode);
289 2629557 : symbol *s = (symbol *) an;
290 :
291 2629557 : if (s) {
292 2629557 : symbol_init(s, SQL_ATOM, type_symbol);
293 2629557 : an->a = data;
294 : }
295 2629557 : return s;
296 : }
|