@balena/abstract-sql-compiler 7.20.6 → 7.20.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.versionbot/CHANGELOG.yml +15 -1
- package/CHANGELOG.md +4 -0
- package/package.json +2 -2
- package/test/abstract-sql/aggregate.ts +0 -446
- package/test/abstract-sql/dates.ts +156 -0
- package/test/abstract-sql/duration.ts +70 -0
- package/test/abstract-sql/math.ts +89 -0
- package/test/abstract-sql/text.ts +179 -0
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
- commits:
|
|
2
|
+
- subject: "CI: Split up abstract-sql tests"
|
|
3
|
+
hash: ccb1ab49aff947a8e06b109abe0c8d0dec291133
|
|
4
|
+
body: ""
|
|
5
|
+
footer:
|
|
6
|
+
Change-type: patch
|
|
7
|
+
change-type: patch
|
|
8
|
+
Signed-off-by: Josh Bowling <josh@monarci.com>
|
|
9
|
+
signed-off-by: Josh Bowling <josh@monarci.com>
|
|
10
|
+
author: Josh Bowling
|
|
11
|
+
nested: []
|
|
12
|
+
version: 7.20.7
|
|
13
|
+
title: ""
|
|
14
|
+
date: 2022-11-17T00:41:49.560Z
|
|
1
15
|
- commits:
|
|
2
16
|
- subject: "CI: Add more abstract-sql unit tests"
|
|
3
17
|
hash: 58f6210f55806ad15fd5e9c90079f208e64b781d
|
|
@@ -11,7 +25,7 @@
|
|
|
11
25
|
nested: []
|
|
12
26
|
version: 7.20.6
|
|
13
27
|
title: ""
|
|
14
|
-
date: 2022-11-16T08:37
|
|
28
|
+
date: 2022-11-16T08:40:37.105Z
|
|
15
29
|
- commits:
|
|
16
30
|
- subject: Fix Right SQL generation
|
|
17
31
|
hash: 8b6715c84ac7dab4c4248d19afa4b578c0d6c0ec
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file
|
|
|
4
4
|
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
|
|
5
5
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
|
6
6
|
|
|
7
|
+
## 7.20.7 - 2022-11-17
|
|
8
|
+
|
|
9
|
+
* CI: Split up abstract-sql tests [Josh Bowling]
|
|
10
|
+
|
|
7
11
|
## 7.20.6 - 2022-11-16
|
|
8
12
|
|
|
9
13
|
* CI: Add more abstract-sql unit tests [Josh Bowling]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@balena/abstract-sql-compiler",
|
|
3
|
-
"version": "7.20.
|
|
3
|
+
"version": "7.20.7",
|
|
4
4
|
"description": "A translator for abstract sql into sql.",
|
|
5
5
|
"main": "out/AbstractSQLCompiler.js",
|
|
6
6
|
"types": "out/AbstractSQLCompiler.d.ts",
|
|
@@ -63,6 +63,6 @@
|
|
|
63
63
|
]
|
|
64
64
|
},
|
|
65
65
|
"versionist": {
|
|
66
|
-
"publishedAt": "2022-11-
|
|
66
|
+
"publishedAt": "2022-11-17T00:41:49.962Z"
|
|
67
67
|
}
|
|
68
68
|
}
|
|
@@ -40,449 +40,3 @@ describe('Sum', () => {
|
|
|
40
40
|
},
|
|
41
41
|
);
|
|
42
42
|
});
|
|
43
|
-
|
|
44
|
-
describe('Add', () => {
|
|
45
|
-
test(
|
|
46
|
-
['SelectQuery', ['Select', [['Add', ['Number', 5], ['Number', 3]]]]],
|
|
47
|
-
(result, sqlEquals) => {
|
|
48
|
-
it('should produce a valid Add statement', () => {
|
|
49
|
-
sqlEquals(result.query, 'SELECT 5 + 3');
|
|
50
|
-
});
|
|
51
|
-
},
|
|
52
|
-
);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
describe('Subtract', () => {
|
|
56
|
-
test(
|
|
57
|
-
['SelectQuery', ['Select', [['Subtract', ['Number', 5], ['Number', 3]]]]],
|
|
58
|
-
(result, sqlEquals) => {
|
|
59
|
-
it('should produce a valid Subtract statement', () => {
|
|
60
|
-
sqlEquals(result.query, 'SELECT 5 - 3');
|
|
61
|
-
});
|
|
62
|
-
},
|
|
63
|
-
);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
describe('Multiply', () => {
|
|
67
|
-
test(
|
|
68
|
-
['SelectQuery', ['Select', [['Multiply', ['Number', 5], ['Number', 3]]]]],
|
|
69
|
-
(result, sqlEquals) => {
|
|
70
|
-
it('should produce a valid Multiply statement', () => {
|
|
71
|
-
sqlEquals(result.query, 'SELECT 5 * 3');
|
|
72
|
-
});
|
|
73
|
-
},
|
|
74
|
-
);
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
describe('Divide', () => {
|
|
78
|
-
test(
|
|
79
|
-
['SelectQuery', ['Select', [['Divide', ['Number', 10], ['Number', 5]]]]],
|
|
80
|
-
(result, sqlEquals) => {
|
|
81
|
-
it('should produce a valid Divide statement', () => {
|
|
82
|
-
sqlEquals(result.query, 'SELECT 10 / 5');
|
|
83
|
-
});
|
|
84
|
-
},
|
|
85
|
-
);
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
describe('Year', () => {
|
|
89
|
-
test(
|
|
90
|
-
['SelectQuery', ['Select', [['Year', ['Date', '2022-10-10']]]]],
|
|
91
|
-
[['Date', '2022-10-10']],
|
|
92
|
-
(result, sqlEquals) => {
|
|
93
|
-
it('should produce a valid Year statement', () => {
|
|
94
|
-
sqlEquals(result.query, `SELECT EXTRACT('YEAR' FROM $1)`);
|
|
95
|
-
});
|
|
96
|
-
},
|
|
97
|
-
);
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
describe('Month', () => {
|
|
101
|
-
test(
|
|
102
|
-
['SelectQuery', ['Select', [['Month', ['Date', '2022-10-10']]]]],
|
|
103
|
-
[['Date', '2022-10-10']],
|
|
104
|
-
(result, sqlEquals) => {
|
|
105
|
-
it('should produce a valid Month statement', () => {
|
|
106
|
-
sqlEquals(result.query, `SELECT EXTRACT('MONTH' FROM $1)`);
|
|
107
|
-
});
|
|
108
|
-
},
|
|
109
|
-
);
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
describe('Day', () => {
|
|
113
|
-
test(
|
|
114
|
-
['SelectQuery', ['Select', [['Day', ['Date', '2022-10-10']]]]],
|
|
115
|
-
[['Date', '2022-10-10']],
|
|
116
|
-
(result, sqlEquals) => {
|
|
117
|
-
it('should produce a valid Day statement', () => {
|
|
118
|
-
sqlEquals(result.query, `SELECT EXTRACT('DAY' FROM $1)`);
|
|
119
|
-
});
|
|
120
|
-
},
|
|
121
|
-
);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
describe('Hour', () => {
|
|
125
|
-
test(
|
|
126
|
-
[
|
|
127
|
-
'SelectQuery',
|
|
128
|
-
['Select', [['Hour', ['Date', '2022-10-10T10:10:10.000Z']]]],
|
|
129
|
-
],
|
|
130
|
-
[['Date', '2022-10-10T10:10:10.000Z']],
|
|
131
|
-
(result, sqlEquals) => {
|
|
132
|
-
it('should produce a valid Hour statement', () => {
|
|
133
|
-
sqlEquals(result.query, `SELECT EXTRACT('HOUR' FROM $1)`);
|
|
134
|
-
});
|
|
135
|
-
},
|
|
136
|
-
);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
describe('Minute', () => {
|
|
140
|
-
test(
|
|
141
|
-
[
|
|
142
|
-
'SelectQuery',
|
|
143
|
-
['Select', [['Minute', ['Date', '2022-10-10T10:10:10.000Z']]]],
|
|
144
|
-
],
|
|
145
|
-
[['Date', '2022-10-10T10:10:10.000Z']],
|
|
146
|
-
(result, sqlEquals) => {
|
|
147
|
-
it('should produce a valid Minute statement', () => {
|
|
148
|
-
sqlEquals(result.query, `SELECT EXTRACT('MINUTE' FROM $1)`);
|
|
149
|
-
});
|
|
150
|
-
},
|
|
151
|
-
);
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
describe('Second', () => {
|
|
155
|
-
test(
|
|
156
|
-
[
|
|
157
|
-
'SelectQuery',
|
|
158
|
-
['Select', [['Second', ['Date', '2022-10-10T10:10:10.000Z']]]],
|
|
159
|
-
],
|
|
160
|
-
[['Date', '2022-10-10T10:10:10.000Z']],
|
|
161
|
-
(result, sqlEquals) => {
|
|
162
|
-
it('should produce a valid extract second statement', () => {
|
|
163
|
-
sqlEquals(result.query, `SELECT FLOOR(EXTRACT('SECOND' FROM $1))`);
|
|
164
|
-
});
|
|
165
|
-
},
|
|
166
|
-
);
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
describe('Fractionalseconds', () => {
|
|
170
|
-
test(
|
|
171
|
-
[
|
|
172
|
-
'SelectQuery',
|
|
173
|
-
['Select', [['Fractionalseconds', ['Date', '2022-10-10T10:10:10.000Z']]]],
|
|
174
|
-
],
|
|
175
|
-
[['Date', '2022-10-10T10:10:10.000Z']],
|
|
176
|
-
(result, sqlEquals) => {
|
|
177
|
-
it('should produce a valid extract Fractionalseconds statement', () => {
|
|
178
|
-
sqlEquals(
|
|
179
|
-
result.query,
|
|
180
|
-
`SELECT EXTRACT('SECOND' FROM $1) - FLOOR(EXTRACT('SECOND' FROM $1))`,
|
|
181
|
-
);
|
|
182
|
-
});
|
|
183
|
-
},
|
|
184
|
-
);
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
describe('Totalseconds', () => {
|
|
188
|
-
test(
|
|
189
|
-
[
|
|
190
|
-
'SelectQuery',
|
|
191
|
-
[
|
|
192
|
-
'Select',
|
|
193
|
-
[
|
|
194
|
-
[
|
|
195
|
-
'Totalseconds',
|
|
196
|
-
[
|
|
197
|
-
'Duration',
|
|
198
|
-
{
|
|
199
|
-
day: 1,
|
|
200
|
-
},
|
|
201
|
-
],
|
|
202
|
-
],
|
|
203
|
-
],
|
|
204
|
-
],
|
|
205
|
-
],
|
|
206
|
-
(result, sqlEquals) => {
|
|
207
|
-
it('should produce a valid Totalseconds statement', () => {
|
|
208
|
-
sqlEquals(
|
|
209
|
-
result.query,
|
|
210
|
-
`SELECT EXTRACT(EPOCH FROM INTERVAL '1 0:0:0.0')`,
|
|
211
|
-
);
|
|
212
|
-
});
|
|
213
|
-
},
|
|
214
|
-
);
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
describe('Concatenate', () => {
|
|
218
|
-
test(
|
|
219
|
-
[
|
|
220
|
-
'SelectQuery',
|
|
221
|
-
[
|
|
222
|
-
'Select',
|
|
223
|
-
[['Concatenate', ['EmbeddedText', 'foo'], ['EmbeddedText', 'bar']]],
|
|
224
|
-
],
|
|
225
|
-
],
|
|
226
|
-
(result, sqlEquals) => {
|
|
227
|
-
it('should produce a valid Concatenate statement', () => {
|
|
228
|
-
sqlEquals(result.query, `SELECT ('foo' || 'bar')`);
|
|
229
|
-
});
|
|
230
|
-
},
|
|
231
|
-
);
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
describe('ConcatenateWithSeparator', () => {
|
|
235
|
-
test(
|
|
236
|
-
[
|
|
237
|
-
'SelectQuery',
|
|
238
|
-
[
|
|
239
|
-
'Select',
|
|
240
|
-
[
|
|
241
|
-
[
|
|
242
|
-
'ConcatenateWithSeparator',
|
|
243
|
-
['EmbeddedText', '|'],
|
|
244
|
-
['EmbeddedText', 'foo'],
|
|
245
|
-
['EmbeddedText', 'bar'],
|
|
246
|
-
],
|
|
247
|
-
],
|
|
248
|
-
],
|
|
249
|
-
],
|
|
250
|
-
(result, sqlEquals) => {
|
|
251
|
-
it('should produce a valid ConcatenateWithSeparator statement', () => {
|
|
252
|
-
sqlEquals(result.query, `SELECT CONCAT_WS('|', 'foo', 'bar')`);
|
|
253
|
-
});
|
|
254
|
-
},
|
|
255
|
-
);
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
describe('Replace', () => {
|
|
259
|
-
test(
|
|
260
|
-
[
|
|
261
|
-
'SelectQuery',
|
|
262
|
-
[
|
|
263
|
-
'Select',
|
|
264
|
-
[
|
|
265
|
-
[
|
|
266
|
-
'Replace',
|
|
267
|
-
['EmbeddedText', 'foobar'],
|
|
268
|
-
['EmbeddedText', 'bar'],
|
|
269
|
-
['EmbeddedText', 'baz'],
|
|
270
|
-
],
|
|
271
|
-
],
|
|
272
|
-
],
|
|
273
|
-
],
|
|
274
|
-
(result, sqlEquals) => {
|
|
275
|
-
it('should produce a valid Replace statement', () => {
|
|
276
|
-
sqlEquals(result.query, `SELECT REPLACE('foobar', 'bar', 'baz')`);
|
|
277
|
-
});
|
|
278
|
-
},
|
|
279
|
-
);
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
describe('CharacterLength', () => {
|
|
283
|
-
test(
|
|
284
|
-
[
|
|
285
|
-
'SelectQuery',
|
|
286
|
-
['Select', [['CharacterLength', ['EmbeddedText', 'foobar']]]],
|
|
287
|
-
],
|
|
288
|
-
(result, sqlEquals) => {
|
|
289
|
-
it('should produce a valid CharacterLength statement', () => {
|
|
290
|
-
sqlEquals(result.query, `SELECT LENGTH('foobar')`);
|
|
291
|
-
});
|
|
292
|
-
},
|
|
293
|
-
);
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
describe('StrPos', () => {
|
|
297
|
-
test(
|
|
298
|
-
[
|
|
299
|
-
'SelectQuery',
|
|
300
|
-
[
|
|
301
|
-
'Select',
|
|
302
|
-
[['StrPos', ['EmbeddedText', 'foobar'], ['EmbeddedText', 'b']]],
|
|
303
|
-
],
|
|
304
|
-
],
|
|
305
|
-
(result, sqlEquals) => {
|
|
306
|
-
it('should produce a valid StrPos statement', () => {
|
|
307
|
-
sqlEquals(result.query, `SELECT STRPOS('foobar', 'b')`);
|
|
308
|
-
});
|
|
309
|
-
},
|
|
310
|
-
);
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
describe('Duration', () => {
|
|
314
|
-
test(
|
|
315
|
-
[
|
|
316
|
-
'SelectQuery',
|
|
317
|
-
[
|
|
318
|
-
'Select',
|
|
319
|
-
[
|
|
320
|
-
[
|
|
321
|
-
'Duration',
|
|
322
|
-
{
|
|
323
|
-
negative: false,
|
|
324
|
-
day: 1,
|
|
325
|
-
hour: 2,
|
|
326
|
-
minute: 3,
|
|
327
|
-
second: 4,
|
|
328
|
-
},
|
|
329
|
-
],
|
|
330
|
-
],
|
|
331
|
-
],
|
|
332
|
-
],
|
|
333
|
-
(result, sqlEquals) => {
|
|
334
|
-
it('should produce a valid Duration statement', () => {
|
|
335
|
-
sqlEquals(result.query, `SELECT INTERVAL '1 2:3:4.0'`);
|
|
336
|
-
});
|
|
337
|
-
},
|
|
338
|
-
);
|
|
339
|
-
});
|
|
340
|
-
|
|
341
|
-
describe('Substring', () => {
|
|
342
|
-
test(
|
|
343
|
-
[
|
|
344
|
-
'SelectQuery',
|
|
345
|
-
[
|
|
346
|
-
'Select',
|
|
347
|
-
[
|
|
348
|
-
[
|
|
349
|
-
'Substring',
|
|
350
|
-
['EmbeddedText', 'foobar'],
|
|
351
|
-
['Number', 0],
|
|
352
|
-
['Number', 5],
|
|
353
|
-
],
|
|
354
|
-
],
|
|
355
|
-
],
|
|
356
|
-
],
|
|
357
|
-
(result, sqlEquals) => {
|
|
358
|
-
it('should produce a valid Substring statement', () => {
|
|
359
|
-
sqlEquals(result.query, `SELECT SUBSTRING('foobar', 0, 5)`);
|
|
360
|
-
});
|
|
361
|
-
},
|
|
362
|
-
);
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
describe('Right', () => {
|
|
366
|
-
test(
|
|
367
|
-
[
|
|
368
|
-
'SelectQuery',
|
|
369
|
-
['Select', [['Right', ['EmbeddedText', 'foobar'], ['Number', 1]]]],
|
|
370
|
-
],
|
|
371
|
-
(result, sqlEquals) => {
|
|
372
|
-
it('should produce a valid Right statement', () => {
|
|
373
|
-
sqlEquals(result.query, `SELECT RIGHT('foobar', 1)`);
|
|
374
|
-
});
|
|
375
|
-
},
|
|
376
|
-
);
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
describe('Lower', () => {
|
|
380
|
-
test(
|
|
381
|
-
['SelectQuery', ['Select', [['Lower', ['EmbeddedText', 'FOOBAR']]]]],
|
|
382
|
-
(result, sqlEquals) => {
|
|
383
|
-
it('should produce a valid Lower statement', () => {
|
|
384
|
-
sqlEquals(result.query, `SELECT LOWER('FOOBAR')`);
|
|
385
|
-
});
|
|
386
|
-
},
|
|
387
|
-
);
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
describe('Upper', () => {
|
|
391
|
-
test(
|
|
392
|
-
['SelectQuery', ['Select', [['Upper', ['EmbeddedText', 'foobar']]]]],
|
|
393
|
-
(result, sqlEquals) => {
|
|
394
|
-
it('should produce a valid Upper statement', () => {
|
|
395
|
-
sqlEquals(result.query, `SELECT UPPER('foobar')`);
|
|
396
|
-
});
|
|
397
|
-
},
|
|
398
|
-
);
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
describe('Trim', () => {
|
|
402
|
-
test(
|
|
403
|
-
['SelectQuery', ['Select', [['Trim', ['EmbeddedText', ' foobar ']]]]],
|
|
404
|
-
(result, sqlEquals) => {
|
|
405
|
-
it('should produce a valid Trim statement', () => {
|
|
406
|
-
sqlEquals(result.query, `SELECT TRIM(' foobar ')`);
|
|
407
|
-
});
|
|
408
|
-
},
|
|
409
|
-
);
|
|
410
|
-
});
|
|
411
|
-
|
|
412
|
-
describe('Round', () => {
|
|
413
|
-
test(
|
|
414
|
-
['SelectQuery', ['Select', [['Round', ['Number', 10.4]]]]],
|
|
415
|
-
(result, sqlEquals) => {
|
|
416
|
-
it('should produce a valid Round statement', () => {
|
|
417
|
-
sqlEquals(result.query, `SELECT ROUND(10.4)`);
|
|
418
|
-
});
|
|
419
|
-
},
|
|
420
|
-
);
|
|
421
|
-
});
|
|
422
|
-
|
|
423
|
-
describe('Floor', () => {
|
|
424
|
-
test(
|
|
425
|
-
['SelectQuery', ['Select', [['Floor', ['Number', 10.4]]]]],
|
|
426
|
-
(result, sqlEquals) => {
|
|
427
|
-
it('should produce a valid Floor statement', () => {
|
|
428
|
-
sqlEquals(result.query, `SELECT FLOOR(10.4)`);
|
|
429
|
-
});
|
|
430
|
-
},
|
|
431
|
-
);
|
|
432
|
-
});
|
|
433
|
-
|
|
434
|
-
describe('Ceiling', () => {
|
|
435
|
-
test(
|
|
436
|
-
['SelectQuery', ['Select', [['Ceiling', ['Number', 10.4]]]]],
|
|
437
|
-
(result, sqlEquals) => {
|
|
438
|
-
it('should produce a valid Ceiling statement', () => {
|
|
439
|
-
sqlEquals(result.query, `SELECT CEILING(10.4)`);
|
|
440
|
-
});
|
|
441
|
-
},
|
|
442
|
-
);
|
|
443
|
-
});
|
|
444
|
-
|
|
445
|
-
describe('ToDate', () => {
|
|
446
|
-
test(
|
|
447
|
-
['SelectQuery', ['Select', [['ToDate', ['Date', '2022-10-10']]]]],
|
|
448
|
-
[['Date', '2022-10-10']],
|
|
449
|
-
(result, sqlEquals) => {
|
|
450
|
-
it('should produce a valid ToDate statement', () => {
|
|
451
|
-
sqlEquals(result.query, `SELECT DATE($1)`);
|
|
452
|
-
});
|
|
453
|
-
},
|
|
454
|
-
);
|
|
455
|
-
});
|
|
456
|
-
|
|
457
|
-
describe('DateTrunc', () => {
|
|
458
|
-
test(
|
|
459
|
-
[
|
|
460
|
-
'SelectQuery',
|
|
461
|
-
[
|
|
462
|
-
'Select',
|
|
463
|
-
[['DateTrunc', ['EmbeddedText', 'year'], ['Date', '2022-10-10']]],
|
|
464
|
-
],
|
|
465
|
-
],
|
|
466
|
-
[['Date', '2022-10-10']],
|
|
467
|
-
(result, sqlEquals) => {
|
|
468
|
-
it('should produce a valid DateTrunc statement', () => {
|
|
469
|
-
sqlEquals(result.query, `SELECT DATE_TRUNC('year', $1)`);
|
|
470
|
-
});
|
|
471
|
-
},
|
|
472
|
-
);
|
|
473
|
-
});
|
|
474
|
-
|
|
475
|
-
describe('ToTime', () => {
|
|
476
|
-
test(
|
|
477
|
-
[
|
|
478
|
-
'SelectQuery',
|
|
479
|
-
['Select', [['ToTime', ['Date', '2022-10-10T10:10:10.000Z']]]],
|
|
480
|
-
],
|
|
481
|
-
[['Date', '2022-10-10T10:10:10.000Z']],
|
|
482
|
-
(result, sqlEquals) => {
|
|
483
|
-
it('should produce a valid ToTime statement', () => {
|
|
484
|
-
sqlEquals(result.query, `SELECT CAST($1 AS TIME)`);
|
|
485
|
-
});
|
|
486
|
-
},
|
|
487
|
-
);
|
|
488
|
-
});
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { AbstractSqlQuery } from '../../src/AbstractSQLCompiler';
|
|
2
|
+
|
|
3
|
+
type TestCb = (
|
|
4
|
+
result: { query: string },
|
|
5
|
+
sqlEquals: (a: string, b: string) => void,
|
|
6
|
+
) => void;
|
|
7
|
+
// tslint:disable-next-line no-var-requires
|
|
8
|
+
const test = require('./test') as (
|
|
9
|
+
query: AbstractSqlQuery,
|
|
10
|
+
binds: any[][] | TestCb,
|
|
11
|
+
cb?: TestCb,
|
|
12
|
+
) => void;
|
|
13
|
+
|
|
14
|
+
describe('Year', () => {
|
|
15
|
+
test(
|
|
16
|
+
['SelectQuery', ['Select', [['Year', ['Date', '2022-10-10']]]]],
|
|
17
|
+
[['Date', '2022-10-10']],
|
|
18
|
+
(result, sqlEquals) => {
|
|
19
|
+
it('should produce a valid Year statement', () => {
|
|
20
|
+
sqlEquals(result.query, `SELECT EXTRACT('YEAR' FROM $1)`);
|
|
21
|
+
});
|
|
22
|
+
},
|
|
23
|
+
);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe('Month', () => {
|
|
27
|
+
test(
|
|
28
|
+
['SelectQuery', ['Select', [['Month', ['Date', '2022-10-10']]]]],
|
|
29
|
+
[['Date', '2022-10-10']],
|
|
30
|
+
(result, sqlEquals) => {
|
|
31
|
+
it('should produce a valid Month statement', () => {
|
|
32
|
+
sqlEquals(result.query, `SELECT EXTRACT('MONTH' FROM $1)`);
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
describe('Day', () => {
|
|
39
|
+
test(
|
|
40
|
+
['SelectQuery', ['Select', [['Day', ['Date', '2022-10-10']]]]],
|
|
41
|
+
[['Date', '2022-10-10']],
|
|
42
|
+
(result, sqlEquals) => {
|
|
43
|
+
it('should produce a valid Day statement', () => {
|
|
44
|
+
sqlEquals(result.query, `SELECT EXTRACT('DAY' FROM $1)`);
|
|
45
|
+
});
|
|
46
|
+
},
|
|
47
|
+
);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe('Hour', () => {
|
|
51
|
+
test(
|
|
52
|
+
[
|
|
53
|
+
'SelectQuery',
|
|
54
|
+
['Select', [['Hour', ['Date', '2022-10-10T10:10:10.000Z']]]],
|
|
55
|
+
],
|
|
56
|
+
[['Date', '2022-10-10T10:10:10.000Z']],
|
|
57
|
+
(result, sqlEquals) => {
|
|
58
|
+
it('should produce a valid Hour statement', () => {
|
|
59
|
+
sqlEquals(result.query, `SELECT EXTRACT('HOUR' FROM $1)`);
|
|
60
|
+
});
|
|
61
|
+
},
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
describe('Minute', () => {
|
|
66
|
+
test(
|
|
67
|
+
[
|
|
68
|
+
'SelectQuery',
|
|
69
|
+
['Select', [['Minute', ['Date', '2022-10-10T10:10:10.000Z']]]],
|
|
70
|
+
],
|
|
71
|
+
[['Date', '2022-10-10T10:10:10.000Z']],
|
|
72
|
+
(result, sqlEquals) => {
|
|
73
|
+
it('should produce a valid Minute statement', () => {
|
|
74
|
+
sqlEquals(result.query, `SELECT EXTRACT('MINUTE' FROM $1)`);
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe('Second', () => {
|
|
81
|
+
test(
|
|
82
|
+
[
|
|
83
|
+
'SelectQuery',
|
|
84
|
+
['Select', [['Second', ['Date', '2022-10-10T10:10:10.000Z']]]],
|
|
85
|
+
],
|
|
86
|
+
[['Date', '2022-10-10T10:10:10.000Z']],
|
|
87
|
+
(result, sqlEquals) => {
|
|
88
|
+
it('should produce a valid extract second statement', () => {
|
|
89
|
+
sqlEquals(result.query, `SELECT FLOOR(EXTRACT('SECOND' FROM $1))`);
|
|
90
|
+
});
|
|
91
|
+
},
|
|
92
|
+
);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe('Fractionalseconds', () => {
|
|
96
|
+
test(
|
|
97
|
+
[
|
|
98
|
+
'SelectQuery',
|
|
99
|
+
['Select', [['Fractionalseconds', ['Date', '2022-10-10T10:10:10.000Z']]]],
|
|
100
|
+
],
|
|
101
|
+
[['Date', '2022-10-10T10:10:10.000Z']],
|
|
102
|
+
(result, sqlEquals) => {
|
|
103
|
+
it('should produce a valid extract Fractionalseconds statement', () => {
|
|
104
|
+
sqlEquals(
|
|
105
|
+
result.query,
|
|
106
|
+
`SELECT EXTRACT('SECOND' FROM $1) - FLOOR(EXTRACT('SECOND' FROM $1))`,
|
|
107
|
+
);
|
|
108
|
+
});
|
|
109
|
+
},
|
|
110
|
+
);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe('ToDate', () => {
|
|
114
|
+
test(
|
|
115
|
+
['SelectQuery', ['Select', [['ToDate', ['Date', '2022-10-10']]]]],
|
|
116
|
+
[['Date', '2022-10-10']],
|
|
117
|
+
(result, sqlEquals) => {
|
|
118
|
+
it('should produce a valid ToDate statement', () => {
|
|
119
|
+
sqlEquals(result.query, `SELECT DATE($1)`);
|
|
120
|
+
});
|
|
121
|
+
},
|
|
122
|
+
);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
describe('DateTrunc', () => {
|
|
126
|
+
test(
|
|
127
|
+
[
|
|
128
|
+
'SelectQuery',
|
|
129
|
+
[
|
|
130
|
+
'Select',
|
|
131
|
+
[['DateTrunc', ['EmbeddedText', 'year'], ['Date', '2022-10-10']]],
|
|
132
|
+
],
|
|
133
|
+
],
|
|
134
|
+
[['Date', '2022-10-10']],
|
|
135
|
+
(result, sqlEquals) => {
|
|
136
|
+
it('should produce a valid DateTrunc statement', () => {
|
|
137
|
+
sqlEquals(result.query, `SELECT DATE_TRUNC('year', $1)`);
|
|
138
|
+
});
|
|
139
|
+
},
|
|
140
|
+
);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
describe('ToTime', () => {
|
|
144
|
+
test(
|
|
145
|
+
[
|
|
146
|
+
'SelectQuery',
|
|
147
|
+
['Select', [['ToTime', ['Date', '2022-10-10T10:10:10.000Z']]]],
|
|
148
|
+
],
|
|
149
|
+
[['Date', '2022-10-10T10:10:10.000Z']],
|
|
150
|
+
(result, sqlEquals) => {
|
|
151
|
+
it('should produce a valid ToTime statement', () => {
|
|
152
|
+
sqlEquals(result.query, `SELECT CAST($1 AS TIME)`);
|
|
153
|
+
});
|
|
154
|
+
},
|
|
155
|
+
);
|
|
156
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { AbstractSqlQuery } from '../../src/AbstractSQLCompiler';
|
|
2
|
+
|
|
3
|
+
type TestCb = (
|
|
4
|
+
result: { query: string },
|
|
5
|
+
sqlEquals: (a: string, b: string) => void,
|
|
6
|
+
) => void;
|
|
7
|
+
// tslint:disable-next-line no-var-requires
|
|
8
|
+
const test = require('./test') as (
|
|
9
|
+
query: AbstractSqlQuery,
|
|
10
|
+
binds: any[][] | TestCb,
|
|
11
|
+
cb?: TestCb,
|
|
12
|
+
) => void;
|
|
13
|
+
|
|
14
|
+
describe('Totalseconds', () => {
|
|
15
|
+
test(
|
|
16
|
+
[
|
|
17
|
+
'SelectQuery',
|
|
18
|
+
[
|
|
19
|
+
'Select',
|
|
20
|
+
[
|
|
21
|
+
[
|
|
22
|
+
'Totalseconds',
|
|
23
|
+
[
|
|
24
|
+
'Duration',
|
|
25
|
+
{
|
|
26
|
+
day: 1,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
],
|
|
30
|
+
],
|
|
31
|
+
],
|
|
32
|
+
],
|
|
33
|
+
(result, sqlEquals) => {
|
|
34
|
+
it('should produce a valid Totalseconds statement', () => {
|
|
35
|
+
sqlEquals(
|
|
36
|
+
result.query,
|
|
37
|
+
`SELECT EXTRACT(EPOCH FROM INTERVAL '1 0:0:0.0')`,
|
|
38
|
+
);
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
describe('Duration', () => {
|
|
45
|
+
test(
|
|
46
|
+
[
|
|
47
|
+
'SelectQuery',
|
|
48
|
+
[
|
|
49
|
+
'Select',
|
|
50
|
+
[
|
|
51
|
+
[
|
|
52
|
+
'Duration',
|
|
53
|
+
{
|
|
54
|
+
negative: false,
|
|
55
|
+
day: 1,
|
|
56
|
+
hour: 2,
|
|
57
|
+
minute: 3,
|
|
58
|
+
second: 4,
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
],
|
|
62
|
+
],
|
|
63
|
+
],
|
|
64
|
+
(result, sqlEquals) => {
|
|
65
|
+
it('should produce a valid Duration statement', () => {
|
|
66
|
+
sqlEquals(result.query, `SELECT INTERVAL '1 2:3:4.0'`);
|
|
67
|
+
});
|
|
68
|
+
},
|
|
69
|
+
);
|
|
70
|
+
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { AbstractSqlQuery } from '../../src/AbstractSQLCompiler';
|
|
2
|
+
|
|
3
|
+
type TestCb = (
|
|
4
|
+
result: { query: string },
|
|
5
|
+
sqlEquals: (a: string, b: string) => void,
|
|
6
|
+
) => void;
|
|
7
|
+
// tslint:disable-next-line no-var-requires
|
|
8
|
+
const test = require('./test') as (
|
|
9
|
+
query: AbstractSqlQuery,
|
|
10
|
+
binds: any[][] | TestCb,
|
|
11
|
+
cb?: TestCb,
|
|
12
|
+
) => void;
|
|
13
|
+
|
|
14
|
+
describe('Add', () => {
|
|
15
|
+
test(
|
|
16
|
+
['SelectQuery', ['Select', [['Add', ['Number', 5], ['Number', 3]]]]],
|
|
17
|
+
(result, sqlEquals) => {
|
|
18
|
+
it('should produce a valid Add statement', () => {
|
|
19
|
+
sqlEquals(result.query, 'SELECT 5 + 3');
|
|
20
|
+
});
|
|
21
|
+
},
|
|
22
|
+
);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe('Subtract', () => {
|
|
26
|
+
test(
|
|
27
|
+
['SelectQuery', ['Select', [['Subtract', ['Number', 5], ['Number', 3]]]]],
|
|
28
|
+
(result, sqlEquals) => {
|
|
29
|
+
it('should produce a valid Subtract statement', () => {
|
|
30
|
+
sqlEquals(result.query, 'SELECT 5 - 3');
|
|
31
|
+
});
|
|
32
|
+
},
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe('Multiply', () => {
|
|
37
|
+
test(
|
|
38
|
+
['SelectQuery', ['Select', [['Multiply', ['Number', 5], ['Number', 3]]]]],
|
|
39
|
+
(result, sqlEquals) => {
|
|
40
|
+
it('should produce a valid Multiply statement', () => {
|
|
41
|
+
sqlEquals(result.query, 'SELECT 5 * 3');
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe('Divide', () => {
|
|
48
|
+
test(
|
|
49
|
+
['SelectQuery', ['Select', [['Divide', ['Number', 10], ['Number', 5]]]]],
|
|
50
|
+
(result, sqlEquals) => {
|
|
51
|
+
it('should produce a valid Divide statement', () => {
|
|
52
|
+
sqlEquals(result.query, 'SELECT 10 / 5');
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe('Round', () => {
|
|
59
|
+
test(
|
|
60
|
+
['SelectQuery', ['Select', [['Round', ['Number', 10.4]]]]],
|
|
61
|
+
(result, sqlEquals) => {
|
|
62
|
+
it('should produce a valid Round statement', () => {
|
|
63
|
+
sqlEquals(result.query, `SELECT ROUND(10.4)`);
|
|
64
|
+
});
|
|
65
|
+
},
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
describe('Floor', () => {
|
|
70
|
+
test(
|
|
71
|
+
['SelectQuery', ['Select', [['Floor', ['Number', 10.4]]]]],
|
|
72
|
+
(result, sqlEquals) => {
|
|
73
|
+
it('should produce a valid Floor statement', () => {
|
|
74
|
+
sqlEquals(result.query, `SELECT FLOOR(10.4)`);
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe('Ceiling', () => {
|
|
81
|
+
test(
|
|
82
|
+
['SelectQuery', ['Select', [['Ceiling', ['Number', 10.4]]]]],
|
|
83
|
+
(result, sqlEquals) => {
|
|
84
|
+
it('should produce a valid Ceiling statement', () => {
|
|
85
|
+
sqlEquals(result.query, `SELECT CEILING(10.4)`);
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
);
|
|
89
|
+
});
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { AbstractSqlQuery } from '../../src/AbstractSQLCompiler';
|
|
2
|
+
|
|
3
|
+
type TestCb = (
|
|
4
|
+
result: { query: string },
|
|
5
|
+
sqlEquals: (a: string, b: string) => void,
|
|
6
|
+
) => void;
|
|
7
|
+
// tslint:disable-next-line no-var-requires
|
|
8
|
+
const test = require('./test') as (
|
|
9
|
+
query: AbstractSqlQuery,
|
|
10
|
+
binds: any[][] | TestCb,
|
|
11
|
+
cb?: TestCb,
|
|
12
|
+
) => void;
|
|
13
|
+
|
|
14
|
+
describe('Concatenate', () => {
|
|
15
|
+
test(
|
|
16
|
+
[
|
|
17
|
+
'SelectQuery',
|
|
18
|
+
[
|
|
19
|
+
'Select',
|
|
20
|
+
[['Concatenate', ['EmbeddedText', 'foo'], ['EmbeddedText', 'bar']]],
|
|
21
|
+
],
|
|
22
|
+
],
|
|
23
|
+
(result, sqlEquals) => {
|
|
24
|
+
it('should produce a valid Concatenate statement', () => {
|
|
25
|
+
sqlEquals(result.query, `SELECT ('foo' || 'bar')`);
|
|
26
|
+
});
|
|
27
|
+
},
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
describe('ConcatenateWithSeparator', () => {
|
|
32
|
+
test(
|
|
33
|
+
[
|
|
34
|
+
'SelectQuery',
|
|
35
|
+
[
|
|
36
|
+
'Select',
|
|
37
|
+
[
|
|
38
|
+
[
|
|
39
|
+
'ConcatenateWithSeparator',
|
|
40
|
+
['EmbeddedText', '|'],
|
|
41
|
+
['EmbeddedText', 'foo'],
|
|
42
|
+
['EmbeddedText', 'bar'],
|
|
43
|
+
],
|
|
44
|
+
],
|
|
45
|
+
],
|
|
46
|
+
],
|
|
47
|
+
(result, sqlEquals) => {
|
|
48
|
+
it('should produce a valid ConcatenateWithSeparator statement', () => {
|
|
49
|
+
sqlEquals(result.query, `SELECT CONCAT_WS('|', 'foo', 'bar')`);
|
|
50
|
+
});
|
|
51
|
+
},
|
|
52
|
+
);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
describe('Replace', () => {
|
|
56
|
+
test(
|
|
57
|
+
[
|
|
58
|
+
'SelectQuery',
|
|
59
|
+
[
|
|
60
|
+
'Select',
|
|
61
|
+
[
|
|
62
|
+
[
|
|
63
|
+
'Replace',
|
|
64
|
+
['EmbeddedText', 'foobar'],
|
|
65
|
+
['EmbeddedText', 'bar'],
|
|
66
|
+
['EmbeddedText', 'baz'],
|
|
67
|
+
],
|
|
68
|
+
],
|
|
69
|
+
],
|
|
70
|
+
],
|
|
71
|
+
(result, sqlEquals) => {
|
|
72
|
+
it('should produce a valid Replace statement', () => {
|
|
73
|
+
sqlEquals(result.query, `SELECT REPLACE('foobar', 'bar', 'baz')`);
|
|
74
|
+
});
|
|
75
|
+
},
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
describe('CharacterLength', () => {
|
|
80
|
+
test(
|
|
81
|
+
[
|
|
82
|
+
'SelectQuery',
|
|
83
|
+
['Select', [['CharacterLength', ['EmbeddedText', 'foobar']]]],
|
|
84
|
+
],
|
|
85
|
+
(result, sqlEquals) => {
|
|
86
|
+
it('should produce a valid CharacterLength statement', () => {
|
|
87
|
+
sqlEquals(result.query, `SELECT LENGTH('foobar')`);
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
describe('StrPos', () => {
|
|
94
|
+
test(
|
|
95
|
+
[
|
|
96
|
+
'SelectQuery',
|
|
97
|
+
[
|
|
98
|
+
'Select',
|
|
99
|
+
[['StrPos', ['EmbeddedText', 'foobar'], ['EmbeddedText', 'b']]],
|
|
100
|
+
],
|
|
101
|
+
],
|
|
102
|
+
(result, sqlEquals) => {
|
|
103
|
+
it('should produce a valid StrPos statement', () => {
|
|
104
|
+
sqlEquals(result.query, `SELECT STRPOS('foobar', 'b')`);
|
|
105
|
+
});
|
|
106
|
+
},
|
|
107
|
+
);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe('Substring', () => {
|
|
111
|
+
test(
|
|
112
|
+
[
|
|
113
|
+
'SelectQuery',
|
|
114
|
+
[
|
|
115
|
+
'Select',
|
|
116
|
+
[
|
|
117
|
+
[
|
|
118
|
+
'Substring',
|
|
119
|
+
['EmbeddedText', 'foobar'],
|
|
120
|
+
['Number', 0],
|
|
121
|
+
['Number', 5],
|
|
122
|
+
],
|
|
123
|
+
],
|
|
124
|
+
],
|
|
125
|
+
],
|
|
126
|
+
(result, sqlEquals) => {
|
|
127
|
+
it('should produce a valid Substring statement', () => {
|
|
128
|
+
sqlEquals(result.query, `SELECT SUBSTRING('foobar', 0, 5)`);
|
|
129
|
+
});
|
|
130
|
+
},
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
describe('Right', () => {
|
|
135
|
+
test(
|
|
136
|
+
[
|
|
137
|
+
'SelectQuery',
|
|
138
|
+
['Select', [['Right', ['EmbeddedText', 'foobar'], ['Number', 1]]]],
|
|
139
|
+
],
|
|
140
|
+
(result, sqlEquals) => {
|
|
141
|
+
it('should produce a valid Right statement', () => {
|
|
142
|
+
sqlEquals(result.query, `SELECT RIGHT('foobar', 1)`);
|
|
143
|
+
});
|
|
144
|
+
},
|
|
145
|
+
);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
describe('Lower', () => {
|
|
149
|
+
test(
|
|
150
|
+
['SelectQuery', ['Select', [['Lower', ['EmbeddedText', 'FOOBAR']]]]],
|
|
151
|
+
(result, sqlEquals) => {
|
|
152
|
+
it('should produce a valid Lower statement', () => {
|
|
153
|
+
sqlEquals(result.query, `SELECT LOWER('FOOBAR')`);
|
|
154
|
+
});
|
|
155
|
+
},
|
|
156
|
+
);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
describe('Upper', () => {
|
|
160
|
+
test(
|
|
161
|
+
['SelectQuery', ['Select', [['Upper', ['EmbeddedText', 'foobar']]]]],
|
|
162
|
+
(result, sqlEquals) => {
|
|
163
|
+
it('should produce a valid Upper statement', () => {
|
|
164
|
+
sqlEquals(result.query, `SELECT UPPER('foobar')`);
|
|
165
|
+
});
|
|
166
|
+
},
|
|
167
|
+
);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
describe('Trim', () => {
|
|
171
|
+
test(
|
|
172
|
+
['SelectQuery', ['Select', [['Trim', ['EmbeddedText', ' foobar ']]]]],
|
|
173
|
+
(result, sqlEquals) => {
|
|
174
|
+
it('should produce a valid Trim statement', () => {
|
|
175
|
+
sqlEquals(result.query, `SELECT TRIM(' foobar ')`);
|
|
176
|
+
});
|
|
177
|
+
},
|
|
178
|
+
);
|
|
179
|
+
});
|