squirreling 0.9.2 → 0.9.3

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/src/types.d.ts CHANGED
@@ -276,6 +276,22 @@ export type StringFunc =
276
276
  | 'RIGHT'
277
277
  | 'INSTR'
278
278
 
279
+ export type SpatialFunc =
280
+ | 'ST_INTERSECTS'
281
+ | 'ST_CONTAINS'
282
+ | 'ST_CONTAINSPROPERLY'
283
+ | 'ST_WITHIN'
284
+ | 'ST_OVERLAPS'
285
+ | 'ST_TOUCHES'
286
+ | 'ST_EQUALS'
287
+ | 'ST_CROSSES'
288
+ | 'ST_COVERS'
289
+ | 'ST_COVEREDBY'
290
+ | 'ST_DWITHIN'
291
+ | 'ST_GEOMFROMTEXT'
292
+ | 'ST_MAKEENVELOPE'
293
+ | 'ST_ASTEXT'
294
+
279
295
  export interface StarColumn {
280
296
  kind: 'star'
281
297
  table?: string
package/src/validation.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ParseError } from './parseErrors.js'
2
2
 
3
3
  /**
4
- * @import { AggregateFunc, BinaryOp, ExprNode, FunctionNode, IntervalUnit, MathFunc, StringFunc, UserDefinedFunction } from './types.js'
4
+ * @import { AggregateFunc, BinaryOp, ExprNode, FunctionNode, IntervalUnit, MathFunc, SpatialFunc, StringFunc, UserDefinedFunction } from './types.js'
5
5
  * @param {string} name
6
6
  * @returns {name is AggregateFunc}
7
7
  */
@@ -79,6 +79,19 @@ export function isRegexpFunc(name) {
79
79
  return ['REGEXP_SUBSTR', 'REGEXP_REPLACE'].includes(name)
80
80
  }
81
81
 
82
+ /**
83
+ * @param {string} name
84
+ * @returns {name is SpatialFunc}
85
+ */
86
+ export function isSpatialFunc(name) {
87
+ return [
88
+ 'ST_INTERSECTS', 'ST_CONTAINS', 'ST_CONTAINSPROPERLY', 'ST_WITHIN',
89
+ 'ST_OVERLAPS', 'ST_TOUCHES', 'ST_EQUALS', 'ST_CROSSES',
90
+ 'ST_COVERS', 'ST_COVEREDBY', 'ST_DWITHIN',
91
+ 'ST_GEOMFROMTEXT', 'ST_MAKEENVELOPE', 'ST_ASTEXT',
92
+ ].includes(name)
93
+ }
94
+
82
95
  /**
83
96
  * @param {string} name
84
97
  * @returns {name is MathFunc}
@@ -178,6 +191,12 @@ export const FUNCTION_ARG_COUNTS = {
178
191
  JSON_OBJECT: { min: 0 },
179
192
  JSON_ARRAYAGG: { min: 1, max: 1 },
180
193
 
194
+ // Array functions
195
+ ARRAY_LENGTH: { min: 1, max: 1 },
196
+ ARRAY_POSITION: { min: 2, max: 2 },
197
+ ARRAY_SORT: { min: 1, max: 1 },
198
+ CARDINALITY: { min: 1, max: 1 },
199
+
181
200
  // Conditional functions
182
201
  COALESCE: { min: 1 },
183
202
  NULLIF: { min: 2, max: 2 },
@@ -190,6 +209,22 @@ export const FUNCTION_ARG_COUNTS = {
190
209
  MAX: { min: 1, max: 1 },
191
210
  STDDEV_SAMP: { min: 1, max: 1 },
192
211
  STDDEV_POP: { min: 1, max: 1 },
212
+
213
+ // Spatial predicate functions
214
+ ST_INTERSECTS: { min: 2, max: 2 },
215
+ ST_CONTAINS: { min: 2, max: 2 },
216
+ ST_CONTAINSPROPERLY: { min: 2, max: 2 },
217
+ ST_WITHIN: { min: 2, max: 2 },
218
+ ST_OVERLAPS: { min: 2, max: 2 },
219
+ ST_TOUCHES: { min: 2, max: 2 },
220
+ ST_EQUALS: { min: 2, max: 2 },
221
+ ST_CROSSES: { min: 2, max: 2 },
222
+ ST_COVERS: { min: 2, max: 2 },
223
+ ST_COVEREDBY: { min: 2, max: 2 },
224
+ ST_DWITHIN: { min: 3, max: 3 },
225
+ ST_GEOMFROMTEXT: { min: 1, max: 1 },
226
+ ST_MAKEENVELOPE: { min: 4, max: 4 },
227
+ ST_ASTEXT: { min: 1, max: 1 },
193
228
  }
194
229
 
195
230
  /**
@@ -249,7 +284,8 @@ export function isKnownFunction(funcName, functions) {
249
284
  isAggregateFunc(funcName) ||
250
285
  isMathFunc(funcName) ||
251
286
  isStringFunc(funcName) ||
252
- isRegexpFunc(funcName)
287
+ isRegexpFunc(funcName) ||
288
+ isSpatialFunc(funcName)
253
289
  ) {
254
290
  return true
255
291
  }
@@ -258,6 +294,7 @@ export function isKnownFunction(funcName, functions) {
258
294
  if ([
259
295
  'CURRENT_DATE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP',
260
296
  'JSON_VALUE', 'JSON_QUERY', 'JSON_OBJECT',
297
+ 'ARRAY_LENGTH', 'ARRAY_POSITION', 'ARRAY_SORT', 'CARDINALITY',
261
298
  'COALESCE', 'NULLIF', 'CAST',
262
299
  ].includes(funcName)) {
263
300
  return true
@@ -68,6 +68,22 @@ export const FUNCTION_SIGNATURES = {
68
68
  MAX: 'expression',
69
69
  STDDEV_SAMP: 'expression',
70
70
  STDDEV_POP: 'expression',
71
+
72
+ // Spatial predicate functions
73
+ ST_INTERSECTS: 'geometry, geometry',
74
+ ST_CONTAINS: 'geometry, geometry',
75
+ ST_CONTAINSPROPERLY: 'geometry, geometry',
76
+ ST_WITHIN: 'geometry, geometry',
77
+ ST_OVERLAPS: 'geometry, geometry',
78
+ ST_TOUCHES: 'geometry, geometry',
79
+ ST_EQUALS: 'geometry, geometry',
80
+ ST_CROSSES: 'geometry, geometry',
81
+ ST_COVERS: 'geometry, geometry',
82
+ ST_COVEREDBY: 'geometry, geometry',
83
+ ST_DWITHIN: 'geometry, geometry, distance',
84
+ ST_GEOMFROMTEXT: 'wkt',
85
+ ST_MAKEENVELOPE: 'xmin, ymin, xmax, ymax',
86
+ ST_ASTEXT: 'geometry',
71
87
  }
72
88
 
73
89
  /**