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