55// Created by Wes Wickwire on 3/3/25.
66//
77
8+ import OrderedCollections
9+
810enum Builtins {
911 /// Operators
1012 static let negate = TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) ] , ret: . var( 0 ) ) )
@@ -14,7 +16,7 @@ enum Builtins {
1416 static let arithmetic = TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) , . var( 0 ) ] , ret: . var( 0 ) ) )
1517 static let comparison = TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) , . var( 0 ) ] , ret: . bool) )
1618 static let `in` = TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) , . row( . unknown( . var( 0 ) ) ) ] , ret: . bool) )
17- static let concat = TypeScheme ( typeVariables: [ 0 , 1 ] , type: . fn( params: [ . var( 0 ) , . var( 1 ) ] , ret: . text) )
19+ static let concatOp = TypeScheme ( typeVariables: [ 0 , 1 ] , type: . fn( params: [ . var( 0 ) , . var( 1 ) ] , ret: . text) )
1820 static let extract = TypeScheme ( typeVariables: [ 0 , 1 ] , type: . fn( params: [ . var( 0 ) ] , ret: . var( 1 ) ) )
1921 static let extractJson = TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) ] , ret: . any) )
2022 static let collate = TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text] , ret: . text) )
@@ -23,7 +25,56 @@ enum Builtins {
2325 static let regexp = TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text, . text] , ret: . bool) )
2426 static let glob = TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text, . text] , ret: . bool) )
2527
26- /// Functions
27- static let max = TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) ] , ret: . var( 0 ) ) , variadic: true )
28- static let sum = TypeScheme ( typeVariables: [ TypeVariable ( 0 , kind: . integer) ] , type: . fn( params: [ . var( TypeVariable ( 0 , kind: . integer) ) ] , ret: . var( TypeVariable ( 0 , kind: . integer) ) ) )
28+ static let functions : OrderedDictionary < Substring , TypeScheme > = [
29+ // Scalar functions
30+ " abs " : TypeScheme ( typeVariables: [ . integer( 0 ) ] , type: . fn( params: [ . var( . integer( 0 ) ) ] , ret: . var( . integer( 0 ) ) ) ) ,
31+ " changes " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ ] , ret: . integer) ) ,
32+ " char " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . integer] , ret: . text) , variadic: true ) ,
33+ " coalesce " : TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . optional( . var( 0 ) ) ] , ret: . var( 0 ) ) , variadic: true ) ,
34+ " concat " : TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) ] , ret: . text) ) ,
35+ " concat_ws " : TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . text, . var( 0 ) ] , ret: . text) ) ,
36+ " format " : TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . text, . var( 0 ) ] , ret: . text) ) ,
37+ " glob " : Builtins . glob,
38+ " hex " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . blob] , ret: . text) ) ,
39+ // iif - Cannot support currently since it takes its parameters in 2's
40+ " ifnull " : TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) , . var( 1 ) ] , ret: . var( 1 ) ) ) ,
41+ " instr " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text, . text] , ret: . integer) ) ,
42+ " last_insert_rowid " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ ] , ret: . integer) ) ,
43+ " length " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text] , ret: . integer) ) ,
44+ " like " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text, . text] , ret: . bool) ) ,
45+ " likelihood " : TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) , . real] , ret: . var( 0 ) ) ) ,
46+ " likely " : TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) ] , ret: . var( 0 ) ) ) ,
47+ " lower " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text] , ret: . text) ) ,
48+ " ltrim " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text, . text] , ret: . text) ) ,
49+ " max " : TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) ] , ret: . var( 0 ) ) , variadic: true ) ,
50+ " min " : TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) ] , ret: . var( 0 ) ) , variadic: true ) ,
51+ " nullif " : TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) , . var( 0 ) ] , ret: . optional( . var( 0 ) ) ) ) ,
52+ " octet_length " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text] , ret: . integer) ) ,
53+ " random " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ ] , ret: . integer) ) ,
54+ " randomblob " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . integer] , ret: . blob) ) ,
55+ " replace " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text, . text, . text] , ret: . text) ) ,
56+ " round " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . real, . integer] , ret: . real) ) ,
57+ " rtrim " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text, . text] , ret: . text) ) ,
58+ " sign " : TypeScheme ( typeVariables: [ . integer( 0 ) ] , type: . fn( params: [ . var( . integer( 0 ) ) ] , ret: . integer) ) ,
59+ " soundex " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text] , ret: . text) ) ,
60+ " substr " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text, . integer, . integer] , ret: . text) ) ,
61+ " substring " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text, . integer, . integer] , ret: . text) ) ,
62+ " trim " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text, . text] , ret: . text) ) ,
63+ " typeof " : TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) ] , ret: . text) ) ,
64+ " unhex " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text] , ret: . blob) ) ,
65+ " unicode " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text] , ret: . integer) ) ,
66+ " unlikely " : TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) ] , ret: . var( 0 ) ) ) ,
67+ " upper " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text] , ret: . text) ) ,
68+ " zeroblob " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . integer] , ret: . blob) ) ,
69+
70+ // Aggregate Functions
71+ " avg " : TypeScheme ( typeVariables: [ . integer( 0 ) ] , type: . fn( params: [ . var( . integer( 0 ) ) ] , ret: . var( . integer( 0 ) ) ) ) ,
72+ " count " : TypeScheme ( typeVariables: [ 0 ] , type: . fn( params: [ . var( 0 ) ] , ret: . integer) ) ,
73+ " group_concat " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text, . text] , ret: . text) ) ,
74+ " string_agg " : TypeScheme ( typeVariables: [ ] , type: . fn( params: [ . text, . text] , ret: . text) ) ,
75+ // 'max' and 'min' are added through the scalar functions and can be reused.
76+ // In the future we may need to separate these if we store them separately
77+ " sum " : TypeScheme ( typeVariables: [ . integer( 0 ) ] , type: . fn( params: [ . var( . integer( 0 ) ) ] , ret: . var( . integer( 0 ) ) ) ) ,
78+ " total " : TypeScheme ( typeVariables: [ . integer( 0 ) ] , type: . fn( params: [ . var( . integer( 0 ) ) ] , ret: . var( . integer( 0 ) ) ) ) ,
79+ ]
2980}
0 commit comments