@balena/abstract-sql-compiler 7.20.3 → 7.20.4

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.
@@ -1,3 +1,17 @@
1
+ - commits:
2
+ - subject: "CI: Add several abstract-sql unit tests"
3
+ hash: e0319dd38e6851c5ed3f2b503ecf2ff93d67f0dd
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.4
13
+ title: ""
14
+ date: 2022-11-16T03:24:53.502Z
1
15
  - commits:
2
16
  - subject: Capitalize AggregateJSON SQL
3
17
  hash: 73ac2303a5912408c76d21c861891bf3b506a788
@@ -13,7 +27,7 @@
13
27
  nested: []
14
28
  version: 7.20.3
15
29
  title: ""
16
- date: 2022-11-15T09:27:24.799Z
30
+ date: 2022-11-15T11:40:34.177Z
17
31
  - commits:
18
32
  - subject: "Dev: Disable package-lock.json generation"
19
33
  hash: 4d769c1a1d2f4f29ed85c6a31dd5b4dd6bced77d
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.4 - 2022-11-16
8
+
9
+ * CI: Add several abstract-sql unit tests [Josh Bowling]
10
+
7
11
  ## 7.20.3 - 2022-11-15
8
12
 
9
13
  * Capitalize AggregateJSON SQL [Josh Bowling]
@@ -8,9 +8,9 @@ export { Binding, SqlResult } from './AbstractSQLRules2SQL';
8
8
  import * as _ from 'lodash';
9
9
  import { ReferencedFields, RuleReferencedFields, ModifiedFields } from './referenced-fields';
10
10
  export type { ReferencedFields, RuleReferencedFields, ModifiedFields };
11
- export declare type NullNode = ['Null'];
12
- export declare type DateNode = ['Date', Date];
13
- export declare type DurationNode = [
11
+ export type NullNode = ['Null'];
12
+ export type DateNode = ['Date', Date];
13
+ export type DurationNode = [
14
14
  'Duration',
15
15
  {
16
16
  negative?: boolean;
@@ -20,114 +20,114 @@ export declare type DurationNode = [
20
20
  second?: number;
21
21
  }
22
22
  ];
23
- export declare type BooleanNode = ['Boolean', boolean];
24
- export declare type EqualsNode = ['Equals', AbstractSqlType, AbstractSqlType];
25
- export declare type NotEqualsNode = ['NotEquals', AbstractSqlType, AbstractSqlType];
26
- export declare type GreaterThanNode = ['GreaterThan', AbstractSqlType, AbstractSqlType];
27
- export declare type GreaterThanOrEqualNode = [
23
+ export type BooleanNode = ['Boolean', boolean];
24
+ export type EqualsNode = ['Equals', AbstractSqlType, AbstractSqlType];
25
+ export type NotEqualsNode = ['NotEquals', AbstractSqlType, AbstractSqlType];
26
+ export type GreaterThanNode = ['GreaterThan', AbstractSqlType, AbstractSqlType];
27
+ export type GreaterThanOrEqualNode = [
28
28
  'GreaterThanOrEqual',
29
29
  AbstractSqlType,
30
30
  AbstractSqlType
31
31
  ];
32
- export declare type LessThanNode = ['LessThan', AbstractSqlType, AbstractSqlType];
33
- export declare type LessThanOrEqualNode = [
32
+ export type LessThanNode = ['LessThan', AbstractSqlType, AbstractSqlType];
33
+ export type LessThanOrEqualNode = [
34
34
  'LessThanOrEqual',
35
35
  AbstractSqlType,
36
36
  AbstractSqlType
37
37
  ];
38
- export declare type InNode = [
38
+ export type InNode = [
39
39
  'In',
40
40
  FieldNode | ReferencedFieldNode,
41
41
  AbstractSqlType,
42
42
  ...AbstractSqlType[]
43
43
  ];
44
- export declare type NotExistsNode = ['NotExists', AbstractSqlType];
45
- export declare type ExistsNode = ['Exists', AbstractSqlType];
46
- export declare type NotNode = ['Not', BooleanTypeNodes];
47
- export declare type AndNode = ['And', ...BooleanTypeNodes[]];
48
- export declare type OrNode = ['Or', ...BooleanTypeNodes[]];
49
- export declare type BooleanTypeNodes = BooleanNode | EqualsNode | NotEqualsNode | GreaterThanNode | GreaterThanOrEqualNode | LessThanNode | LessThanOrEqualNode | InNode | ExistsNode | NotExistsNode | NotNode | AndNode | OrNode | UnknownTypeNodes;
50
- export declare type NumberNode = ['Number', number];
51
- export declare type CountNode = ['Count', '*'];
52
- export declare type AverageNode = ['Average', NumberTypeNodes];
53
- export declare type SumNode = ['Sum', NumberTypeNodes];
54
- export declare type NumberTypeNodes = NumberNode | CountNode | AverageNode | SumNode | UnknownTypeNodes;
55
- export declare type FieldNode = ['Field', string];
56
- export declare type ReferencedFieldNode = ['ReferencedField', string, string];
57
- export declare type DateTruncNode = ['DateTrunc', TextTypeNodes, DateTypeNodes];
58
- export declare type DateTypeNodes = DateNode | DateTruncNode;
59
- export declare type BindNode = ['Bind', number | string] | ['Bind', string, string];
60
- export declare type CastNode = ['Cast', AbstractSqlType, string];
61
- export declare type CoalesceNode = [
44
+ export type NotExistsNode = ['NotExists', AbstractSqlType];
45
+ export type ExistsNode = ['Exists', AbstractSqlType];
46
+ export type NotNode = ['Not', BooleanTypeNodes];
47
+ export type AndNode = ['And', ...BooleanTypeNodes[]];
48
+ export type OrNode = ['Or', ...BooleanTypeNodes[]];
49
+ export type BooleanTypeNodes = BooleanNode | EqualsNode | NotEqualsNode | GreaterThanNode | GreaterThanOrEqualNode | LessThanNode | LessThanOrEqualNode | InNode | ExistsNode | NotExistsNode | NotNode | AndNode | OrNode | UnknownTypeNodes;
50
+ export type NumberNode = ['Number', number];
51
+ export type CountNode = ['Count', '*'];
52
+ export type AverageNode = ['Average', NumberTypeNodes];
53
+ export type SumNode = ['Sum', NumberTypeNodes];
54
+ export type NumberTypeNodes = NumberNode | CountNode | AverageNode | SumNode | UnknownTypeNodes;
55
+ export type FieldNode = ['Field', string];
56
+ export type ReferencedFieldNode = ['ReferencedField', string, string];
57
+ export type DateTruncNode = ['DateTrunc', TextTypeNodes, DateTypeNodes];
58
+ export type DateTypeNodes = DateNode | DateTruncNode;
59
+ export type BindNode = ['Bind', number | string] | ['Bind', string, string];
60
+ export type CastNode = ['Cast', AbstractSqlType, string];
61
+ export type CoalesceNode = [
62
62
  'Cast',
63
63
  UnknownTypeNodes,
64
64
  UnknownTypeNodes,
65
65
  ...UnknownTypeNodes[]
66
66
  ];
67
- export declare type UnknownTypeNodes = FieldNode | ReferencedFieldNode | BindNode | CastNode | CoalesceNode | UnknownNode;
68
- export declare type TextNode = ['Text', string];
69
- export declare type ConcatenateNode = ['Concatenate', ...TextTypeNodes[]];
70
- export declare type ConcatenateWithSeparatorNode = [
67
+ export type UnknownTypeNodes = FieldNode | ReferencedFieldNode | BindNode | CastNode | CoalesceNode | UnknownNode;
68
+ export type TextNode = ['Text', string];
69
+ export type ConcatenateNode = ['Concatenate', ...TextTypeNodes[]];
70
+ export type ConcatenateWithSeparatorNode = [
71
71
  'ConcatenateWithSeparator',
72
72
  TextTypeNodes,
73
73
  ...TextTypeNodes[]
74
74
  ];
75
- export declare type LikeNode = ['Like', AbstractSqlType, AbstractSqlType];
76
- export declare type ReplaceNode = [
75
+ export type LikeNode = ['Like', AbstractSqlType, AbstractSqlType];
76
+ export type ReplaceNode = [
77
77
  'Replace',
78
78
  TextTypeNodes,
79
79
  TextTypeNodes,
80
80
  TextTypeNodes
81
81
  ];
82
- export declare type TextTypeNodes = ConcatenateNode | ConcatenateWithSeparatorNode | LikeNode | ReplaceNode | UnknownTypeNodes;
83
- export declare type SelectQueryNode = [
82
+ export type TextTypeNodes = ConcatenateNode | ConcatenateWithSeparatorNode | LikeNode | ReplaceNode | UnknownTypeNodes;
83
+ export type SelectQueryNode = [
84
84
  'SelectQuery',
85
85
  ...Array<SelectNode | FromNode | InnerJoinNode | LeftJoinNode | RightJoinNode | FullJoinNode | CrossJoinNode | WhereNode | GroupByNode | HavingNode | OrderByNode | LimitNode | OffsetNode>
86
86
  ];
87
- export declare type UnionQueryNode = [
87
+ export type UnionQueryNode = [
88
88
  'UnionQuery',
89
89
  ...(UnionQueryNode | SelectQueryNode)[]
90
90
  ];
91
- export declare type InsertQueryNode = ['InsertQuery', ...AbstractSqlType[]];
92
- export declare type UpdateQueryNode = ['UpdateQuery', ...AbstractSqlType[]];
93
- export declare type DeleteQueryNode = ['DeleteQuery', ...AbstractSqlType[]];
94
- export declare type UpsertQueryNode = ['UpsertQuery', InsertQueryNode, UpdateQueryNode];
91
+ export type InsertQueryNode = ['InsertQuery', ...AbstractSqlType[]];
92
+ export type UpdateQueryNode = ['UpdateQuery', ...AbstractSqlType[]];
93
+ export type DeleteQueryNode = ['DeleteQuery', ...AbstractSqlType[]];
94
+ export type UpsertQueryNode = ['UpsertQuery', InsertQueryNode, UpdateQueryNode];
95
95
  export interface FromTypeNode {
96
96
  SelectQueryNode: SelectQueryNode;
97
97
  UnionQueryNode: UnionQueryNode;
98
98
  TableNode: TableNode;
99
99
  ResourceNode: ResourceNode;
100
100
  }
101
- export declare type ResourceNode = ['Resource', string];
102
- export declare type FromTypeNodes = FromTypeNode[keyof FromTypeNode] | AliasNode<FromTypeNode[keyof FromTypeNode]>;
103
- declare type AliasableFromTypeNodes = FromTypeNodes | AliasNode<FromTypeNodes>;
104
- export declare type SelectNode = ['Select', AbstractSqlType[]];
105
- export declare type FromNode = ['From', AliasableFromTypeNodes];
106
- export declare type InnerJoinNode = ['Join', AliasableFromTypeNodes, OnNode?];
107
- export declare type LeftJoinNode = ['LeftJoin', AliasableFromTypeNodes, OnNode?];
108
- export declare type RightJoinNode = ['RightJoin', AliasableFromTypeNodes, OnNode?];
109
- export declare type FullJoinNode = ['FullJoin', AliasableFromTypeNodes, OnNode?];
110
- export declare type CrossJoinNode = ['CrossJoin', AliasableFromTypeNodes];
111
- export declare type OnNode = ['On', BooleanTypeNodes];
112
- export declare type TableNode = ['Table', string];
113
- export declare type WhereNode = ['Where', BooleanTypeNodes];
114
- export declare type GroupByNode = ['GroupBy', Array<FieldNode | ReferencedFieldNode>];
115
- export declare type HavingNode = ['Having', BooleanTypeNodes];
116
- export declare type OrderByNode = [
101
+ export type ResourceNode = ['Resource', string];
102
+ export type FromTypeNodes = FromTypeNode[keyof FromTypeNode] | AliasNode<FromTypeNode[keyof FromTypeNode]>;
103
+ type AliasableFromTypeNodes = FromTypeNodes | AliasNode<FromTypeNodes>;
104
+ export type SelectNode = ['Select', AbstractSqlType[]];
105
+ export type FromNode = ['From', AliasableFromTypeNodes];
106
+ export type InnerJoinNode = ['Join', AliasableFromTypeNodes, OnNode?];
107
+ export type LeftJoinNode = ['LeftJoin', AliasableFromTypeNodes, OnNode?];
108
+ export type RightJoinNode = ['RightJoin', AliasableFromTypeNodes, OnNode?];
109
+ export type FullJoinNode = ['FullJoin', AliasableFromTypeNodes, OnNode?];
110
+ export type CrossJoinNode = ['CrossJoin', AliasableFromTypeNodes];
111
+ export type OnNode = ['On', BooleanTypeNodes];
112
+ export type TableNode = ['Table', string];
113
+ export type WhereNode = ['Where', BooleanTypeNodes];
114
+ export type GroupByNode = ['GroupBy', Array<FieldNode | ReferencedFieldNode>];
115
+ export type HavingNode = ['Having', BooleanTypeNodes];
116
+ export type OrderByNode = [
117
117
  'OrderBy',
118
118
  ...Array<['ASC' | 'DESC', FieldNode | ReferencedFieldNode]>
119
119
  ];
120
- export declare type LimitNode = ['Limit', NumberTypeNodes];
121
- export declare type OffsetNode = ['Offset', NumberTypeNodes];
122
- export declare type FieldsNode = ['Fields', string[]];
123
- export declare type ValuesNode = [
120
+ export type LimitNode = ['Limit', NumberTypeNodes];
121
+ export type OffsetNode = ['Offset', NumberTypeNodes];
122
+ export type FieldsNode = ['Fields', string[]];
123
+ export type ValuesNode = [
124
124
  'Values',
125
125
  SelectQueryNode | UnionQueryNode | ValuesNodeTypes[]
126
126
  ];
127
- export declare type ValuesNodeTypes = 'Default' | NullNode | BindNode | TextNode | NumberNode;
128
- export declare type AliasNode<T> = ['Alias', T, string];
129
- export declare type AbstractSqlType = string | NullNode | DateNode | BooleanTypeNodes | NumberTypeNodes | TextTypeNodes | UnknownTypeNodes | DurationNode | SelectQueryNode | InsertQueryNode | UpdateQueryNode | DeleteQueryNode | UpsertQueryNode | SelectNode | ValuesNode | InnerJoinNode | LeftJoinNode | RightJoinNode | FullJoinNode | CrossJoinNode | GroupByNode | HavingNode | UnknownNode;
130
- export declare type UnknownNode = AbstractSqlQuery;
127
+ export type ValuesNodeTypes = 'Default' | NullNode | BindNode | TextNode | NumberNode;
128
+ export type AliasNode<T> = ['Alias', T, string];
129
+ export type AbstractSqlType = string | NullNode | DateNode | BooleanTypeNodes | NumberTypeNodes | TextTypeNodes | UnknownTypeNodes | DurationNode | SelectQueryNode | InsertQueryNode | UpdateQueryNode | DeleteQueryNode | UpsertQueryNode | SelectNode | ValuesNode | InnerJoinNode | LeftJoinNode | RightJoinNode | FullJoinNode | CrossJoinNode | GroupByNode | HavingNode | UnknownNode;
130
+ export type UnknownNode = AbstractSqlQuery;
131
131
  export interface AbstractSqlQuery extends Array<AbstractSqlType> {
132
132
  0: string;
133
133
  }
@@ -184,14 +184,14 @@ export interface SqlRule {
184
184
  referencedFields?: ReferencedFields | undefined;
185
185
  ruleReferencedFields?: RuleReferencedFields | undefined;
186
186
  }
187
- export declare type RelationshipMapping = [string, [string, string]?];
187
+ export type RelationshipMapping = [string, [string, string]?];
188
188
  export interface RelationshipLeafNode {
189
189
  $: RelationshipMapping;
190
190
  }
191
191
  export interface RelationshipInternalNode {
192
192
  [resourceName: string]: Relationship;
193
193
  }
194
- export declare type Relationship = RelationshipLeafNode | RelationshipInternalNode;
194
+ export type Relationship = RelationshipLeafNode | RelationshipInternalNode;
195
195
  export interface AbstractSqlModel {
196
196
  synonyms: {
197
197
  [synonym: string]: string;
@@ -1,5 +1,5 @@
1
1
  import { AbstractSqlQuery, AbstractSqlType, Engines, InsertQueryNode, SelectQueryNode, UnionQueryNode, UpdateQueryNode, DeleteQueryNode, UpsertQueryNode } from './AbstractSQLCompiler';
2
- export declare type Binding = [string, any] | ['Bind', number | string | [string, string]];
2
+ export type Binding = [string, any] | ['Bind', number | string | [string, string]];
3
3
  export interface SqlResult {
4
4
  query: string;
5
5
  bindings: Binding[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@balena/abstract-sql-compiler",
3
- "version": "7.20.3",
3
+ "version": "7.20.4",
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-15T09:27:25.077Z"
66
+ "publishedAt": "2022-11-16T03:24:53.788Z"
67
67
  }
68
68
  }
@@ -40,3 +40,324 @@ 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 addition 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 subtraction 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 multiplication 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 division 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 extract 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 extract 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 extract 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 extract 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 extract 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 interval 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 concatenate with separator 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 character length 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 string position 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 interval 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
+ });