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 11950500 : symbol_init(symbol *s, tokens token, symtype type )
20 : {
21 11950500 : s->token = token;
22 11950500 : s->type = type;
23 11950500 : 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 8444850 : symbol_create_list(allocator *sa, tokens token, dlist *data)
40 : {
41 8444850 : symbol *s = SA_NEW(sa, symbol);
42 :
43 8444961 : if (s) {
44 8444961 : symbol_init(s, token, type_list);
45 8444961 : s->data.lval = data;
46 : }
47 8444961 : 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 138150 : symbol_create_symbol(allocator *sa, tokens token, symbol *data)
76 : {
77 138150 : symbol *s = SA_NEW(sa, symbol);
78 :
79 138168 : if (s) {
80 138168 : symbol_init(s, token, type_symbol);
81 138168 : s->data.sym = data;
82 : }
83 138168 : return s;
84 : }
85 :
86 : static dnode *
87 33455129 : dnode_create(allocator *sa )
88 : {
89 33455129 : dnode *n = SA_NEW(sa, dnode);
90 :
91 33456365 : if (n)
92 33456365 : n->next = NULL;
93 33456365 : return n;
94 : }
95 :
96 : static dnode *
97 9924554 : dnode_create_string(allocator *sa, const char *data)
98 : {
99 19849201 : dnode *n = dnode_create(sa);
100 :
101 9924647 : if (n) {
102 9924647 : n->data.sval = (char*)data;
103 9924647 : n->type = type_string;
104 : }
105 9924647 : return n;
106 : }
107 :
108 : static dnode *
109 5597270 : dnode_create_list(allocator *sa, dlist *data)
110 : {
111 11195227 : dnode *n = dnode_create(sa);
112 :
113 5597957 : if (n) {
114 5597957 : n->data.lval = data;
115 5597957 : n->type = type_list;
116 : }
117 5597957 : return n;
118 : }
119 : static dnode *
120 3375518 : dnode_create_int(allocator *sa, int data)
121 : {
122 6751041 : dnode *n = dnode_create(sa);
123 :
124 3375523 : if (n) {
125 3375523 : n->data.i_val = data;
126 3375523 : n->type = type_int;
127 : }
128 3375523 : 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 13449774 : dnode_create_symbol(allocator *sa, symbol *data)
143 : {
144 26902050 : dnode *n = dnode_create(sa);
145 :
146 13452276 : if (n) {
147 13452276 : n->data.sym = data;
148 13452276 : n->type = type_symbol;
149 : }
150 13452276 : return n;
151 : }
152 :
153 : static dnode *
154 1111534 : dnode_create_type(allocator *sa, sql_subtype *data)
155 : {
156 1111534 : dnode *n = dnode_create(sa);
157 :
158 1111534 : if (n) {
159 1111534 : if (data)
160 1111530 : n->data.typeval = *data;
161 : else
162 4 : n->data.typeval.type = NULL;
163 1111534 : n->type = type_type;
164 : }
165 1111534 : return n;
166 : }
167 :
168 : dlist *
169 13719063 : dlist_create(allocator *sa)
170 : {
171 13719063 : dlist *l = SA_NEW(sa, dlist);
172 :
173 13719225 : if (l) {
174 13719225 : l->h = l->t = NULL;
175 13719225 : l->cnt = 0;
176 : }
177 13719225 : return l;
178 : }
179 :
180 : int
181 12430948 : dlist_length(dlist *l)
182 : {
183 12430948 : return l->cnt;
184 : }
185 :
186 : static dlist *
187 33464576 : dlist_append_default(dlist *l, dnode *n)
188 : {
189 33464576 : if (l->cnt) {
190 19747534 : l->t->next = n;
191 : } else {
192 13717042 : l->h = n;
193 : }
194 33464576 : l->t = n;
195 33464576 : l->cnt++;
196 33464576 : return l;
197 : }
198 :
199 : dlist *
200 9924554 : dlist_append_string(allocator *sa, dlist *l, const char *data)
201 : {
202 9924554 : dnode *n = dnode_create_string(sa, data);
203 :
204 9924647 : if (!n)
205 : return NULL;
206 19849294 : return dlist_append_default(l, n);
207 : }
208 :
209 : dlist *
210 5597270 : dlist_append_list(allocator *sa, dlist *l, dlist *data)
211 : {
212 5597270 : dnode *n = dnode_create_list(sa, data);
213 :
214 5597957 : if (!n)
215 : return NULL;
216 11195914 : return dlist_append_default(l, n);
217 : }
218 :
219 : dlist *
220 3375518 : dlist_append_int(allocator *sa, dlist *l, int data)
221 : {
222 3375518 : dnode *n = dnode_create_int(sa, data);
223 :
224 3375523 : if (!n)
225 : return NULL;
226 6751046 : 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 13449774 : dlist_append_symbol(allocator *sa, dlist *l, symbol *data)
241 : {
242 13449774 : dnode *n = dnode_create_symbol(sa, data);
243 :
244 13452276 : if (!n)
245 : return NULL;
246 26904552 : return dlist_append_default(l, n);
247 : }
248 :
249 : dlist *
250 1111534 : dlist_append_type(allocator *sa, dlist *l, sql_subtype *data)
251 : {
252 1111534 : dnode *n = dnode_create_type(sa, data);
253 :
254 1111534 : if (!n)
255 : return NULL;
256 2223068 : return dlist_append_default(l, n);
257 : }
258 :
259 : symbol *
260 382124 : 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 382124 : SelectNode *sn = SA_NEW(sa, SelectNode);
263 382141 : symbol *s = (symbol *) sn;
264 :
265 382141 : if (s) {
266 382141 : symbol_init(s, SQL_SELECT, type_symbol);
267 382141 : sn->distinct = distinct;
268 382141 : sn->lateral = 0;
269 382141 : sn->limit = limit;
270 382141 : sn->offset = offset;
271 382141 : sn->sample = sample;
272 382141 : sn->seed = seed;
273 382141 : sn->selection = selection;
274 382141 : sn->into = into;
275 382141 : sn->from = from;
276 382141 : sn->where = where;
277 382141 : sn->groupby = groupby;
278 382141 : sn->having = having;
279 382141 : sn->orderby = orderby;
280 382141 : sn->name = name;
281 382141 : sn->window = window;
282 382141 : sn->qualify = qualify;
283 : }
284 382141 : return s;
285 : }
286 :
287 : symbol *
288 2699543 : newAtomNode(allocator *sa, atom *data)
289 : {
290 2699543 : AtomNode *an = SA_NEW(sa, AtomNode);
291 2699271 : symbol *s = (symbol *) an;
292 :
293 2699271 : if (s) {
294 2699271 : symbol_init(s, SQL_ATOM, type_symbol);
295 2699271 : an->a = data;
296 : }
297 2699271 : return s;
298 : }
|