Skip to main content

linkrs_query/executor/expression/functions/registry/
builtin.rs

1use super::super::BuiltinFunction;
2use super::{FunctionRegistry, RegistryEntry};
3use linkrs_core::DataType;
4
5impl FunctionRegistry {
6    /// Registering built-in functions
7    pub fn register_builtin(&mut self, function: BuiltinFunction) {
8        let upper_name = function.name().to_uppercase();
9        let return_type = builtin_return_type(&function);
10        self.builtin_functions.insert(
11            upper_name,
12            RegistryEntry {
13                function,
14                return_type,
15            },
16        );
17    }
18
19    /// Register an additional spelling for an already-defined builtin.
20    ///
21    /// Used for compatibility aliases (`NEXTVAL` for `NEXT_VAL`): the entry
22    /// carries the same function value and return type, so dispatch, purity
23    /// classification, and return-type inference stay identical.
24    pub fn register_alias(&mut self, alias: &str, function: BuiltinFunction) {
25        let return_type = builtin_return_type(&function);
26        self.builtin_functions.insert(
27            alias.to_uppercase(),
28            RegistryEntry {
29                function,
30                return_type,
31            },
32        );
33    }
34
35    /// Get the static return type for a function name.
36    pub fn get_return_type(&self, name: &str) -> Option<&DataType> {
37        self.resolve_entry(name).map(|e| &e.return_type)
38    }
39
40    /// Obtaining built-in functions
41    pub fn get_builtin(&self, name: &str) -> Option<&BuiltinFunction> {
42        self.resolve_entry(name).map(|e| &e.function)
43    }
44
45    /// Get the full registry entry (function + return type).
46    pub fn get_entry(&self, name: &str) -> Option<&RegistryEntry> {
47        self.resolve_entry(name)
48    }
49    /// Register all built-in functions
50    pub(super) fn register_all_builtin_functions(&mut self) {
51        use super::super::ConversionFunction;
52        use super::super::DateTimeFunction;
53        use super::super::MathFunction;
54        use super::super::RegexFunction;
55        use super::super::StringFunction;
56
57        // Registering a mathematical function
58        self.register_builtin(BuiltinFunction::Math(MathFunction::Abs));
59        self.register_builtin(BuiltinFunction::Math(MathFunction::Sqrt));
60        self.register_builtin(BuiltinFunction::Math(MathFunction::Pow));
61        self.register_builtin(BuiltinFunction::Math(MathFunction::Log));
62        self.register_builtin(BuiltinFunction::Math(MathFunction::Log10));
63        self.register_builtin(BuiltinFunction::Math(MathFunction::Sin));
64        self.register_builtin(BuiltinFunction::Math(MathFunction::Cos));
65        self.register_builtin(BuiltinFunction::Math(MathFunction::Tan));
66        self.register_builtin(BuiltinFunction::Math(MathFunction::Round));
67        self.register_builtin(BuiltinFunction::Math(MathFunction::Ceil));
68        self.register_builtin(BuiltinFunction::Math(MathFunction::Floor));
69        self.register_builtin(BuiltinFunction::Math(MathFunction::Asin));
70        self.register_builtin(BuiltinFunction::Math(MathFunction::Acos));
71        self.register_builtin(BuiltinFunction::Math(MathFunction::Atan));
72        self.register_builtin(BuiltinFunction::Math(MathFunction::Cbrt));
73        self.register_builtin(BuiltinFunction::Math(MathFunction::Hypot));
74        self.register_builtin(BuiltinFunction::Math(MathFunction::Sign));
75        self.register_builtin(BuiltinFunction::Math(MathFunction::Rand));
76        self.register_builtin(BuiltinFunction::Math(MathFunction::Rand32));
77        self.register_builtin(BuiltinFunction::Math(MathFunction::Rand64));
78        self.register_builtin(BuiltinFunction::Math(MathFunction::E));
79        self.register_builtin(BuiltinFunction::Math(MathFunction::Pi));
80        self.register_builtin(BuiltinFunction::Math(MathFunction::Exp2));
81        self.register_builtin(BuiltinFunction::Math(MathFunction::Log2));
82        self.register_builtin(BuiltinFunction::Math(MathFunction::Radians));
83        self.register_builtin(BuiltinFunction::Math(MathFunction::BitAnd));
84        self.register_builtin(BuiltinFunction::Math(MathFunction::BitOr));
85        self.register_builtin(BuiltinFunction::Math(MathFunction::BitXor));
86        self.register_builtin(BuiltinFunction::Math(MathFunction::Atan2));
87        self.register_builtin(BuiltinFunction::Math(MathFunction::Sinh));
88        self.register_builtin(BuiltinFunction::Math(MathFunction::Cosh));
89        self.register_builtin(BuiltinFunction::Math(MathFunction::Tanh));
90        self.register_builtin(BuiltinFunction::Math(MathFunction::Degrees));
91        self.register_builtin(BuiltinFunction::Math(MathFunction::Gcd));
92        self.register_builtin(BuiltinFunction::Math(MathFunction::Lcm));
93
94        self.register_builtin(BuiltinFunction::Math(MathFunction::Factorial));
95        self.register_builtin(BuiltinFunction::Math(MathFunction::Gamma));
96        self.register_builtin(BuiltinFunction::Math(MathFunction::Lgamma));
97        self.register_builtin(BuiltinFunction::Math(MathFunction::Negate));
98        self.register_builtin(BuiltinFunction::Math(MathFunction::Even));
99        self.register_builtin(BuiltinFunction::Math(MathFunction::SetSeed));
100        self.register_builtin(BuiltinFunction::Math(MathFunction::BitShiftLeft));
101        self.register_builtin(BuiltinFunction::Math(MathFunction::BitShiftRight));
102
103        // Register string function
104        self.register_builtin(BuiltinFunction::String(StringFunction::Upper));
105        self.register_builtin(BuiltinFunction::String(StringFunction::Lower));
106        self.register_builtin(BuiltinFunction::String(StringFunction::Trim));
107        self.register_builtin(BuiltinFunction::String(StringFunction::Substring));
108        self.register_builtin(BuiltinFunction::String(StringFunction::Concat));
109        self.register_builtin(BuiltinFunction::String(StringFunction::Replace));
110        self.register_builtin(BuiltinFunction::String(StringFunction::Contains));
111        self.register_builtin(BuiltinFunction::String(StringFunction::StartsWith));
112        self.register_builtin(BuiltinFunction::String(StringFunction::EndsWith));
113        self.register_builtin(BuiltinFunction::String(StringFunction::Split));
114        self.register_builtin(BuiltinFunction::String(StringFunction::Lpad));
115        self.register_builtin(BuiltinFunction::String(StringFunction::Rpad));
116        self.register_builtin(BuiltinFunction::String(StringFunction::ConcatWs));
117        self.register_builtin(BuiltinFunction::String(StringFunction::Strcasecmp));
118        self.register_builtin(BuiltinFunction::String(StringFunction::Levenshtein));
119        self.register_builtin(BuiltinFunction::String(StringFunction::SplitPart));
120        self.register_builtin(BuiltinFunction::String(StringFunction::Initcap));
121        self.register_builtin(BuiltinFunction::String(StringFunction::Repeat));
122        self.register_builtin(BuiltinFunction::String(StringFunction::Position));
123        self.register_builtin(BuiltinFunction::String(StringFunction::Left));
124        self.register_builtin(BuiltinFunction::String(StringFunction::Right));
125        self.register_builtin(BuiltinFunction::String(StringFunction::StringInsert));
126        self.register_builtin(BuiltinFunction::String(StringFunction::Translate));
127        self.register_builtin(BuiltinFunction::String(StringFunction::Format));
128        self.register_builtin(BuiltinFunction::String(StringFunction::StringSplit));
129        self.register_builtin(BuiltinFunction::String(StringFunction::Reverse));
130
131        // Registering regular expression functions
132        self.register_builtin(BuiltinFunction::Regex(RegexFunction::RegexMatch));
133        self.register_builtin(BuiltinFunction::Regex(RegexFunction::RegexReplace));
134        self.register_builtin(BuiltinFunction::Regex(RegexFunction::RegexFind));
135        self.register_builtin(BuiltinFunction::Regex(RegexFunction::RegexpFullMatch));
136        self.register_builtin(BuiltinFunction::Regex(RegexFunction::RegexpExtract));
137        self.register_builtin(BuiltinFunction::Regex(RegexFunction::RegexpExtractAll));
138        self.register_builtin(BuiltinFunction::Regex(RegexFunction::RegexpSplitToArray));
139
140        // Registration type conversion function
141        self.register_builtin(BuiltinFunction::Conversion(ConversionFunction::ToString));
142        self.register_builtin(BuiltinFunction::Conversion(ConversionFunction::ToInt));
143        self.register_builtin(BuiltinFunction::Conversion(ConversionFunction::ToFloat));
144        self.register_builtin(BuiltinFunction::Conversion(ConversionFunction::ToBool));
145
146        // Registration date and time function
147        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::Now));
148        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::Date));
149        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::Time));
150        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::DateTime));
151        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::Year));
152        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::Month));
153        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::Day));
154        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::Hour));
155        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::Minute));
156        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::Second));
157        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::TimeStamp));
158        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::DateAdd));
159        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::DateSub));
160        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::DateDiff));
161        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::DateTrunc));
162        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::CurrentDate));
163        self.register_builtin(BuiltinFunction::DateTime(
164            DateTimeFunction::CurrentTimestamp,
165        ));
166        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::ToChar));
167        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::ToDate));
168        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::Age));
169        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::LastDay));
170        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::GenerateSeries));
171        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::ToYears));
172        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::ToMonths));
173        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::ToDays));
174        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::ToHours));
175        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::ToMinutes));
176        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::ToSeconds));
177        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::ToMilliseconds));
178        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::ToMicroseconds));
179        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::Century));
180        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::EpochMs));
181        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::ToTimestamp));
182        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::ToEpochMs));
183        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::DatePart));
184        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::DayName));
185        self.register_builtin(BuiltinFunction::DateTime(DateTimeFunction::MonthName));
186
187        // Registering geospatial functions
188        use super::super::GeographyFunction;
189        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StPoint));
190        self.register_builtin(BuiltinFunction::Geography(
191            GeographyFunction::StGeogFromText,
192        ));
193        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StAsText));
194        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StCentroid));
195        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StIsValid));
196        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StIntersects));
197        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StCovers));
198        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StCoveredBy));
199        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StDWithin));
200        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StDistance));
201        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StArea));
202        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StLength));
203        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StPerimeter));
204        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StNPoints));
205        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StStartPoint));
206        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StEndPoint));
207        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StIsRing));
208        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StIsClosed));
209        self.register_builtin(BuiltinFunction::Geography(
210            GeographyFunction::StGeometryType,
211        ));
212        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StContains));
213        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StWithin));
214        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StEnvelope));
215        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StBuffer));
216        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StBoundary));
217        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StCrosses));
218        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StTouches));
219        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StOverlaps));
220        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StEquals));
221        self.register_builtin(BuiltinFunction::Geography(GeographyFunction::StAsGeoJson));
222        self.register_builtin(BuiltinFunction::Geography(
223            GeographyFunction::StGeomFromGeoJson,
224        ));
225
226        // Registering practical functions
227        use super::super::UtilityFunction;
228        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::Coalesce));
229        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::Hash));
230        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::JsonExtract));
231        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::NullIf));
232        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::JsonBuildObject));
233        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::JsonBuildArray));
234        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::JsonObjectKeys));
235        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::Greatest));
236        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::Least));
237        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::GenRandomUuid));
238        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::JsonEach));
239        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::JsonTypeOf));
240        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::JsonStripNulls));
241        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::IfNull));
242        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::TypeOf));
243        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::Version));
244        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::CurrentUser));
245        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::CurrentDatabase));
246        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::Corr));
247        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::CovarPop));
248        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::CovarSamp));
249
250        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::OctetLength));
251        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::Encode));
252        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::Decode));
253        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::UnionValue));
254        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::UnionTag));
255        self.register_builtin(BuiltinFunction::Utility(UtilityFunction::UnionExtract));
256
257        // Register aggregate functions
258        use linkrs_core::types::operators::AggregateFunction;
259        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::Count));
260        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::Sum));
261        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::Avg));
262        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::Min));
263        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::Max));
264        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::Collect));
265        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::CollectSet));
266        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::Variance));
267        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::Median));
268        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::Mode));
269        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::BoolAnd));
270        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::BoolOr));
271        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::StddevPop));
272        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::StddevSamp));
273        self.register_builtin(BuiltinFunction::Aggregate(AggregateFunction::Product));
274        self.register_builtin(BuiltinFunction::Aggregate(
275            AggregateFunction::PercentileCont,
276        ));
277        self.register_builtin(BuiltinFunction::Aggregate(
278            AggregateFunction::GroupConcatWithOrder,
279        ));
280
281        // Register window functions
282        // Window functions are only meaningful inside an OVER() clause and are
283        // computed by the window operator (see blocking/window.rs), so they are
284        // registered first to avoid shadowing graph functions with the same name.
285        self.register_builtin(BuiltinFunction::Window(
286            super::super::builtin::window::WindowFunction::RowNumber,
287        ));
288        self.register_builtin(BuiltinFunction::Window(
289            super::super::builtin::window::WindowFunction::Rank,
290        ));
291        self.register_builtin(BuiltinFunction::Window(
292            super::super::builtin::window::WindowFunction::DenseRank,
293        ));
294        self.register_builtin(BuiltinFunction::Window(
295            super::super::builtin::window::WindowFunction::Lead,
296        ));
297        self.register_builtin(BuiltinFunction::Window(
298            super::super::builtin::window::WindowFunction::Lag,
299        ));
300        self.register_builtin(BuiltinFunction::Window(
301            super::super::builtin::window::WindowFunction::FirstValue,
302        ));
303        self.register_builtin(BuiltinFunction::Window(
304            super::super::builtin::window::WindowFunction::LastValue,
305        ));
306        self.register_builtin(BuiltinFunction::Window(
307            super::super::builtin::window::WindowFunction::NthValue,
308        ));
309        self.register_builtin(BuiltinFunction::Window(
310            super::super::builtin::window::WindowFunction::Ntile,
311        ));
312
313        // Register full-text search functions
314        // Full-text functions are executed through execute_with_context directly
315        // (see fulltext.rs), so they are registered before graph functions to
316        // avoid the full-text rank() shadowing the graph rank(edge).
317        super::super::fulltext::register_fulltext_functions(self);
318
319        // Registering functions related to graphics
320        use super::super::GraphFunction;
321        self.register_builtin(BuiltinFunction::Graph(GraphFunction::Id));
322        self.register_builtin(BuiltinFunction::Graph(GraphFunction::Tags));
323        self.register_builtin(BuiltinFunction::Graph(GraphFunction::Labels));
324        self.register_builtin(BuiltinFunction::Graph(GraphFunction::Properties));
325        self.register_builtin(BuiltinFunction::Graph(GraphFunction::EdgeType));
326        self.register_builtin(BuiltinFunction::Graph(GraphFunction::Src));
327        self.register_builtin(BuiltinFunction::Graph(GraphFunction::Dst));
328        self.register_builtin(BuiltinFunction::Graph(GraphFunction::Rank));
329        self.register_builtin(BuiltinFunction::Graph(GraphFunction::StartNode));
330        self.register_builtin(BuiltinFunction::Graph(GraphFunction::EndNode));
331        self.register_builtin(BuiltinFunction::Graph(GraphFunction::Neighbors));
332        self.register_builtin(BuiltinFunction::Graph(GraphFunction::Degree));
333        self.register_builtin(BuiltinFunction::Graph(GraphFunction::OutEdges));
334        self.register_builtin(BuiltinFunction::Graph(GraphFunction::InEdges));
335        self.register_builtin(BuiltinFunction::Graph(GraphFunction::ShortestPath));
336        self.register_builtin(BuiltinFunction::Graph(GraphFunction::Bfs));
337        self.register_builtin(BuiltinFunction::Graph(GraphFunction::ConnectedComponents));
338        self.register_builtin(BuiltinFunction::Graph(GraphFunction::VariableLengthPath));
339        self.register_builtin(BuiltinFunction::Graph(GraphFunction::PageRank));
340
341        // Register container operation functions
342        use super::super::ContainerFunction;
343        self.register_builtin(BuiltinFunction::Container(ContainerFunction::Head));
344        self.register_builtin(BuiltinFunction::Container(ContainerFunction::Last));
345        self.register_builtin(BuiltinFunction::Container(ContainerFunction::Tail));
346        self.register_builtin(BuiltinFunction::Container(ContainerFunction::Size));
347        self.register_builtin(BuiltinFunction::Container(ContainerFunction::Range));
348        self.register_builtin(BuiltinFunction::Container(ContainerFunction::Keys));
349        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ReverseList));
350        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ToSet));
351        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListContains));
352        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListAppend));
353        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListPrepend));
354        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListFilter));
355        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListTransform));
356        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListConcat));
357        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListSort));
358        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListSlice));
359        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListToString));
360        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListDistinct));
361        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListUnique));
362        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListExtract));
363        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListAny));
364        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListAll));
365        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListSingle));
366        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ListReduce));
367        self.register_builtin(BuiltinFunction::Container(ContainerFunction::StructPack));
368        self.register_builtin(BuiltinFunction::Container(ContainerFunction::StructExtract));
369        self.register_builtin(BuiltinFunction::Container(ContainerFunction::MapCreation));
370        self.register_builtin(BuiltinFunction::Container(ContainerFunction::MapExtract));
371        self.register_builtin(BuiltinFunction::Container(ContainerFunction::ElementAt));
372        self.register_builtin(BuiltinFunction::Container(ContainerFunction::Cardinality));
373        self.register_builtin(BuiltinFunction::Container(ContainerFunction::MapKeys));
374        self.register_builtin(BuiltinFunction::Container(ContainerFunction::MapValues));
375
376        // Register path function
377        use super::super::PathFunction;
378        self.register_builtin(BuiltinFunction::Path(PathFunction::Nodes));
379        self.register_builtin(BuiltinFunction::Path(PathFunction::Relationships));
380        self.register_builtin(BuiltinFunction::Path(PathFunction::Properties));
381        self.register_builtin(BuiltinFunction::Path(PathFunction::IsTrail));
382        self.register_builtin(BuiltinFunction::Path(PathFunction::IsAcyclic));
383        // Polymorphic `length` (string, path, list): the single definition
384        // of this name, so dispatch can never silently shadow another one.
385        self.register_builtin(BuiltinFunction::Path(PathFunction::PathLength));
386
387        // Register vector functions
388        super::super::builtin::vector::register_vector_functions(self);
389
390        // Register sequence functions
391        use super::super::SequenceFunction;
392        self.register_builtin(BuiltinFunction::Sequence(SequenceFunction::CurrVal));
393        self.register_builtin(BuiltinFunction::Sequence(SequenceFunction::NextVal));
394        // Nebula-style spellings without the underscore resolve to the same
395        // variants so `nextval('s')` / `currval('s')` work as documented.
396        self.register_alias(
397            "NEXTVAL",
398            BuiltinFunction::Sequence(SequenceFunction::NextVal),
399        );
400        self.register_alias(
401            "CURRVAL",
402            BuiltinFunction::Sequence(SequenceFunction::CurrVal),
403        );
404    }
405}
406
407fn builtin_return_type(func: &BuiltinFunction) -> DataType {
408    use super::super::ContainerFunction;
409    use super::super::ConversionFunction;
410    use super::super::DateTimeFunction;
411    use super::super::GeographyFunction;
412    use super::super::GraphFunction;
413    use super::super::MathFunction;
414    use super::super::PathFunction;
415    use super::super::RegexFunction;
416    use super::super::SequenceFunction;
417    use super::super::StringFunction;
418    use super::super::UtilityFunction;
419    use super::super::VectorFunction;
420    use crate::executor::expression::functions::builtin::window::WindowFunction;
421    use crate::executor::expression::functions::FulltextFunction;
422    use linkrs_core::types::operators::AggregateFunction;
423    match func {
424        BuiltinFunction::Math(m) => match m {
425            MathFunction::Abs => DataType::Int,
426            MathFunction::Sqrt => DataType::Float,
427            MathFunction::Pow => DataType::Float,
428            MathFunction::Log => DataType::Float,
429            MathFunction::Log10 => DataType::Float,
430            MathFunction::Sin => DataType::Float,
431            MathFunction::Cos => DataType::Float,
432            MathFunction::Tan => DataType::Float,
433            MathFunction::Round => DataType::Float,
434            MathFunction::Ceil => DataType::Float,
435            MathFunction::Floor => DataType::Float,
436            MathFunction::Asin => DataType::Float,
437            MathFunction::Acos => DataType::Float,
438            MathFunction::Atan => DataType::Float,
439            MathFunction::Cbrt => DataType::Float,
440            MathFunction::Hypot => DataType::Float,
441            MathFunction::Sign => DataType::Int,
442            MathFunction::Rand => DataType::Float,
443            MathFunction::Rand32 => DataType::Int,
444            MathFunction::Rand64 => DataType::BigInt,
445            MathFunction::E => DataType::Float,
446            MathFunction::Pi => DataType::Float,
447            MathFunction::Exp2 => DataType::Float,
448            MathFunction::Log2 => DataType::Float,
449            MathFunction::Radians => DataType::Float,
450            MathFunction::BitAnd => DataType::Int,
451            MathFunction::BitOr => DataType::Int,
452            MathFunction::BitXor => DataType::Int,
453            MathFunction::Atan2 => DataType::Float,
454            MathFunction::Sinh => DataType::Float,
455            MathFunction::Cosh => DataType::Float,
456            MathFunction::Tanh => DataType::Float,
457            MathFunction::Degrees => DataType::Float,
458            MathFunction::Gcd => DataType::Int,
459            MathFunction::Lcm => DataType::Int,
460            MathFunction::Factorial => DataType::BigInt,
461            MathFunction::Gamma => DataType::Float,
462            MathFunction::Lgamma => DataType::Float,
463            MathFunction::Negate => DataType::Int,
464            MathFunction::Even => DataType::Int,
465            MathFunction::SetSeed => DataType::Null,
466            MathFunction::BitShiftLeft => DataType::Int,
467            MathFunction::BitShiftRight => DataType::Int,
468        },
469        BuiltinFunction::String(s) => match s {
470            StringFunction::Upper => DataType::String,
471            StringFunction::Lower => DataType::String,
472            StringFunction::Trim => DataType::String,
473            StringFunction::Substring => DataType::String,
474            StringFunction::Concat => DataType::String,
475            StringFunction::Replace => DataType::String,
476            StringFunction::Contains => DataType::Bool,
477            StringFunction::StartsWith => DataType::Bool,
478            StringFunction::EndsWith => DataType::Bool,
479            StringFunction::Split => DataType::List(Box::new(DataType::String)),
480            StringFunction::Lpad => DataType::String,
481            StringFunction::Rpad => DataType::String,
482            StringFunction::ConcatWs => DataType::String,
483            StringFunction::Strcasecmp => DataType::Int,
484            StringFunction::Levenshtein => DataType::Int,
485            StringFunction::SplitPart => DataType::String,
486            StringFunction::Initcap => DataType::String,
487            StringFunction::Repeat => DataType::String,
488            StringFunction::Position => DataType::Int,
489            StringFunction::Left => DataType::String,
490            StringFunction::Right => DataType::String,
491            StringFunction::StringInsert => DataType::String,
492            StringFunction::Translate => DataType::String,
493            StringFunction::Format => DataType::String,
494            StringFunction::StringSplit => DataType::List(Box::new(DataType::String)),
495            StringFunction::Reverse => DataType::String,
496        },
497        BuiltinFunction::Regex(r) => match r {
498            RegexFunction::RegexMatch => DataType::Bool,
499            RegexFunction::RegexReplace => DataType::String,
500            RegexFunction::RegexFind => DataType::String,
501            RegexFunction::RegexpFullMatch => DataType::Bool,
502            RegexFunction::RegexpExtract => DataType::String,
503            RegexFunction::RegexpExtractAll => DataType::List(Box::new(DataType::String)),
504            RegexFunction::RegexpSplitToArray => DataType::List(Box::new(DataType::String)),
505        },
506        BuiltinFunction::Conversion(c) => match c {
507            ConversionFunction::ToString => DataType::String,
508            ConversionFunction::ToInt => DataType::Int,
509            ConversionFunction::ToFloat => DataType::Float,
510            ConversionFunction::ToBool => DataType::Bool,
511        },
512        BuiltinFunction::DateTime(d) => match d {
513            DateTimeFunction::Now => DataType::DateTime,
514            DateTimeFunction::Date => DataType::Date,
515            DateTimeFunction::Time => DataType::Time,
516            DateTimeFunction::DateTime => DataType::DateTime,
517            DateTimeFunction::Year => DataType::Int,
518            DateTimeFunction::Month => DataType::Int,
519            DateTimeFunction::Day => DataType::Int,
520            DateTimeFunction::Hour => DataType::Int,
521            DateTimeFunction::Minute => DataType::Int,
522            DateTimeFunction::Second => DataType::Int,
523            DateTimeFunction::TimeStamp => DataType::BigInt,
524            DateTimeFunction::DateAdd => DataType::Unknown,
525            DateTimeFunction::DateSub => DataType::Unknown,
526            DateTimeFunction::DateDiff => DataType::BigInt,
527            DateTimeFunction::DateTrunc => DataType::Unknown,
528            DateTimeFunction::CurrentDate => DataType::Date,
529            DateTimeFunction::CurrentTimestamp => DataType::BigInt,
530            DateTimeFunction::ToChar => DataType::String,
531            DateTimeFunction::ToDate => DataType::Date,
532            DateTimeFunction::Age => DataType::BigInt,
533            DateTimeFunction::LastDay => DataType::Unknown,
534            DateTimeFunction::GenerateSeries => DataType::List(Box::new(DataType::BigInt)),
535            DateTimeFunction::ToYears => DataType::BigInt,
536            DateTimeFunction::ToMonths => DataType::BigInt,
537            DateTimeFunction::ToDays => DataType::BigInt,
538            DateTimeFunction::ToHours => DataType::BigInt,
539            DateTimeFunction::ToMinutes => DataType::BigInt,
540            DateTimeFunction::ToSeconds => DataType::BigInt,
541            DateTimeFunction::ToMilliseconds => DataType::BigInt,
542            DateTimeFunction::ToMicroseconds => DataType::BigInt,
543            DateTimeFunction::Century => DataType::Int,
544            DateTimeFunction::EpochMs => DataType::BigInt,
545            DateTimeFunction::ToTimestamp => DataType::DateTime,
546            DateTimeFunction::ToEpochMs => DataType::BigInt,
547            DateTimeFunction::DatePart => DataType::Int,
548            DateTimeFunction::DayName => DataType::String,
549            DateTimeFunction::MonthName => DataType::String,
550        },
551        BuiltinFunction::Geography(g) => match g {
552            GeographyFunction::StPoint => DataType::Geography,
553            GeographyFunction::StGeogFromText => DataType::Geography,
554            GeographyFunction::StAsText => DataType::String,
555            GeographyFunction::StCentroid => DataType::Geography,
556            GeographyFunction::StIsValid => DataType::Bool,
557            GeographyFunction::StIntersects => DataType::Bool,
558            GeographyFunction::StCovers => DataType::Bool,
559            GeographyFunction::StCoveredBy => DataType::Bool,
560            GeographyFunction::StDWithin => DataType::Bool,
561            GeographyFunction::StDistance => DataType::Double,
562            GeographyFunction::StArea => DataType::Double,
563            GeographyFunction::StLength => DataType::Double,
564            GeographyFunction::StPerimeter => DataType::Double,
565            GeographyFunction::StNPoints => DataType::Int,
566            GeographyFunction::StStartPoint => DataType::Geography,
567            GeographyFunction::StEndPoint => DataType::Geography,
568            GeographyFunction::StIsRing => DataType::Bool,
569            GeographyFunction::StIsClosed => DataType::Bool,
570            GeographyFunction::StGeometryType => DataType::String,
571            GeographyFunction::StContains => DataType::Bool,
572            GeographyFunction::StWithin => DataType::Bool,
573            GeographyFunction::StEnvelope => DataType::Geography,
574            GeographyFunction::StBuffer => DataType::Geography,
575            GeographyFunction::StBoundary => DataType::Geography,
576            GeographyFunction::StCrosses => DataType::Bool,
577            GeographyFunction::StTouches => DataType::Bool,
578            GeographyFunction::StOverlaps => DataType::Bool,
579            GeographyFunction::StEquals => DataType::Bool,
580            GeographyFunction::StAsGeoJson => DataType::String,
581            GeographyFunction::StGeomFromGeoJson => DataType::Geography,
582        },
583        BuiltinFunction::Utility(u) => match u {
584            UtilityFunction::Coalesce => DataType::Unknown,
585            UtilityFunction::Hash => DataType::BigInt,
586            UtilityFunction::JsonExtract => DataType::String,
587            UtilityFunction::JsonBuildObject => DataType::String,
588            UtilityFunction::JsonBuildArray => DataType::String,
589            UtilityFunction::JsonObjectKeys => DataType::List(Box::new(DataType::String)),
590            UtilityFunction::NullIf => DataType::Unknown,
591            UtilityFunction::Greatest => DataType::Unknown,
592            UtilityFunction::Least => DataType::Unknown,
593            UtilityFunction::GenRandomUuid => DataType::Uuid,
594            UtilityFunction::JsonEach => DataType::List(Box::new(DataType::Empty)),
595            UtilityFunction::JsonTypeOf => DataType::String,
596            UtilityFunction::JsonStripNulls => DataType::String,
597            UtilityFunction::IfNull => DataType::Unknown,
598            UtilityFunction::TypeOf => DataType::String,
599            UtilityFunction::Version => DataType::String,
600            UtilityFunction::CurrentUser => DataType::String,
601            UtilityFunction::CurrentDatabase => DataType::String,
602            UtilityFunction::Corr => DataType::Double,
603            UtilityFunction::CovarPop => DataType::Double,
604            UtilityFunction::CovarSamp => DataType::Double,
605            UtilityFunction::OctetLength => DataType::BigInt,
606            UtilityFunction::Encode => DataType::Blob,
607            UtilityFunction::Decode => DataType::String,
608            UtilityFunction::UnionValue => DataType::Map(Box::new(DataType::Empty)),
609            UtilityFunction::UnionTag => DataType::Int,
610            UtilityFunction::UnionExtract => DataType::Unknown,
611        },
612        BuiltinFunction::Graph(g) => match g {
613            GraphFunction::Id => DataType::BigInt,
614            GraphFunction::Tags => DataType::List(Box::new(DataType::String)),
615            GraphFunction::Labels => DataType::List(Box::new(DataType::String)),
616            GraphFunction::Properties => DataType::Map(Box::new(DataType::Empty)),
617            GraphFunction::EdgeType => DataType::String,
618            GraphFunction::Src => DataType::BigInt,
619            GraphFunction::Dst => DataType::BigInt,
620            GraphFunction::Rank => DataType::BigInt,
621            GraphFunction::StartNode => DataType::Vertex,
622            GraphFunction::EndNode => DataType::Vertex,
623            GraphFunction::Neighbors => DataType::List(Box::new(DataType::BigInt)),
624            GraphFunction::Degree => DataType::BigInt,
625            GraphFunction::OutEdges => DataType::List(Box::new(DataType::Edge)),
626            GraphFunction::InEdges => DataType::List(Box::new(DataType::Edge)),
627            GraphFunction::ShortestPath => DataType::BigInt,
628            GraphFunction::Bfs => DataType::List(Box::new(DataType::BigInt)),
629            GraphFunction::ConnectedComponents => {
630                DataType::List(Box::new(DataType::List(Box::new(DataType::BigInt))))
631            }
632            GraphFunction::VariableLengthPath => {
633                DataType::List(Box::new(DataType::List(Box::new(DataType::BigInt))))
634            }
635            GraphFunction::PageRank => DataType::Map(Box::new(DataType::Double)),
636        },
637        BuiltinFunction::Container(c) => match c {
638            ContainerFunction::Head => DataType::Unknown,
639            ContainerFunction::Last => DataType::Unknown,
640            ContainerFunction::Tail => DataType::List(Box::new(DataType::Empty)),
641            ContainerFunction::Size => DataType::BigInt,
642            ContainerFunction::Range => DataType::List(Box::new(DataType::BigInt)),
643            ContainerFunction::Keys => DataType::List(Box::new(DataType::String)),
644            ContainerFunction::ReverseList => DataType::List(Box::new(DataType::Empty)),
645            ContainerFunction::ToSet => DataType::Set(Box::new(DataType::Empty)),
646            ContainerFunction::ListContains => DataType::Bool,
647            ContainerFunction::ListAppend => DataType::List(Box::new(DataType::Empty)),
648            ContainerFunction::ListPrepend => DataType::List(Box::new(DataType::Empty)),
649            ContainerFunction::ListFilter => DataType::List(Box::new(DataType::Empty)),
650            ContainerFunction::ListTransform => DataType::List(Box::new(DataType::Empty)),
651            ContainerFunction::ListConcat => DataType::List(Box::new(DataType::Empty)),
652            ContainerFunction::ListSort => DataType::List(Box::new(DataType::Empty)),
653            ContainerFunction::ListSlice => DataType::List(Box::new(DataType::Empty)),
654            ContainerFunction::ListToString => DataType::String,
655            ContainerFunction::ListDistinct => DataType::List(Box::new(DataType::Empty)),
656            ContainerFunction::ListUnique => DataType::List(Box::new(DataType::Empty)),
657            ContainerFunction::ListExtract => DataType::Unknown,
658            ContainerFunction::ListAny => DataType::Bool,
659            ContainerFunction::ListAll => DataType::Bool,
660            ContainerFunction::ListSingle => DataType::Bool,
661            ContainerFunction::ListReduce => DataType::Unknown,
662            ContainerFunction::StructPack => DataType::Map(Box::new(DataType::Empty)),
663            ContainerFunction::StructExtract => DataType::Unknown,
664            ContainerFunction::MapCreation => DataType::Map(Box::new(DataType::Empty)),
665            ContainerFunction::MapExtract => DataType::Unknown,
666            ContainerFunction::ElementAt => DataType::Unknown,
667            ContainerFunction::Cardinality => DataType::BigInt,
668            ContainerFunction::MapKeys => DataType::List(Box::new(DataType::String)),
669            ContainerFunction::MapValues => DataType::List(Box::new(DataType::Empty)),
670        },
671        BuiltinFunction::Path(p) => match p {
672            PathFunction::Nodes => DataType::List(Box::new(DataType::Vertex)),
673            PathFunction::Relationships => DataType::List(Box::new(DataType::Edge)),
674            PathFunction::Properties => DataType::List(Box::new(DataType::Empty)),
675            PathFunction::IsTrail => DataType::Bool,
676            PathFunction::IsAcyclic => DataType::Bool,
677            PathFunction::PathLength => DataType::BigInt,
678        },
679        BuiltinFunction::Vector(v) => match v {
680            VectorFunction::CosineSimilarity => DataType::Double,
681            VectorFunction::DotProduct => DataType::Double,
682            VectorFunction::EuclideanDistance => DataType::Double,
683            VectorFunction::ManhattanDistance => DataType::Double,
684            VectorFunction::Dimension => DataType::BigInt,
685            VectorFunction::L2Norm => DataType::Double,
686            VectorFunction::Nnz => DataType::BigInt,
687            VectorFunction::Normalize => DataType::Vector,
688            VectorFunction::ArrayValue => DataType::List(Box::new(DataType::Empty)),
689            VectorFunction::ArrayCosineSimilarity => DataType::Double,
690            VectorFunction::ArrayDistance => DataType::Double,
691            VectorFunction::ArraySquaredDistance => DataType::Double,
692            VectorFunction::ArrayInnerProduct => DataType::Double,
693            VectorFunction::ArrayDotProduct => DataType::Double,
694        },
695        BuiltinFunction::Sequence(s) => match s {
696            SequenceFunction::CurrVal => DataType::BigInt,
697            SequenceFunction::NextVal => DataType::BigInt,
698        },
699        BuiltinFunction::Fulltext(f) => match f {
700            FulltextFunction::Score => DataType::Double,
701            FulltextFunction::Highlight => DataType::String,
702            FulltextFunction::MatchedFields => DataType::List(Box::new(DataType::String)),
703            FulltextFunction::Snippet => DataType::String,
704            FulltextFunction::Rank => DataType::BigInt,
705            FulltextFunction::SearchMatch => DataType::Bool,
706            FulltextFunction::FieldScore => DataType::Double,
707        },
708        BuiltinFunction::Window(w) => match w {
709            WindowFunction::RowNumber => DataType::BigInt,
710            WindowFunction::Rank => DataType::BigInt,
711            WindowFunction::DenseRank => DataType::BigInt,
712            WindowFunction::Lead => DataType::Unknown,
713            WindowFunction::Lag => DataType::Unknown,
714            WindowFunction::FirstValue => DataType::Unknown,
715            WindowFunction::LastValue => DataType::Unknown,
716            WindowFunction::NthValue => DataType::Unknown,
717            WindowFunction::Ntile => DataType::BigInt,
718        },
719        BuiltinFunction::Aggregate(a) => match a {
720            AggregateFunction::Count => DataType::BigInt,
721            AggregateFunction::Sum => DataType::Double,
722            AggregateFunction::Avg => DataType::Double,
723            AggregateFunction::Min => DataType::Unknown,
724            AggregateFunction::Max => DataType::Unknown,
725            AggregateFunction::Collect => DataType::List(Box::new(DataType::Unknown)),
726            AggregateFunction::CollectSet => DataType::Set(Box::new(DataType::Unknown)),
727            AggregateFunction::Variance => DataType::Double,
728            AggregateFunction::Median => DataType::Double,
729            AggregateFunction::Mode => DataType::Unknown,
730            AggregateFunction::BoolAnd => DataType::Bool,
731            AggregateFunction::BoolOr => DataType::Bool,
732            AggregateFunction::StddevPop => DataType::Double,
733            AggregateFunction::StddevSamp => DataType::Double,
734            AggregateFunction::Product => DataType::Double,
735            AggregateFunction::PercentileCont => DataType::Double,
736            AggregateFunction::GroupConcatWithOrder => DataType::String,
737            // Fallback for other variants
738            _ => DataType::Unknown,
739        },
740    }
741}