Skip to main content

uqa_sql/expr/
mod.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Scalar expression evaluator: turns an [`Expr`] into a [`Value`] under
8//! a row context (column -> value) and a parameter binding.
9
10use uqa_core::{ArrayValue, DecimalValue, TemporalValue, Value};
11
12use crate::ast::{BinaryOp, Expr};
13#[cfg(test)]
14use crate::ast::{ColumnType, FunctionBinding, FunctionDispatch};
15use crate::error::{Result, SQLError};
16use crate::params::SQLParam;
17#[cfg(test)]
18use crate::result::ResultRow;
19
20mod array_transform;
21pub mod datums;
22mod encoding;
23mod floating;
24mod in_range;
25pub(crate) mod integer_input;
26mod json;
27mod json_strip;
28mod random;
29mod range;
30mod regex;
31mod time;
32mod uuid;
33
34pub use array_transform::{
35    argument_positions as array_transform_argument_positions,
36    argument_positions_with_control as array_transform_argument_positions_with_control,
37};
38pub use json::{validate_json_object_key_type, value_to_json_text};
39pub use json_strip::argument_positions as json_strip_nulls_argument_positions;
40pub use range::{
41    multirange_from_ranges, parse_multirange, parse_range, CanonicalMultirange, CanonicalRange,
42};
43pub use time::IntervalFields;
44use time::{
45    age_between, coerce_temporal, format_pg_number, format_temporal, hex_encode, make_timestamp,
46    parse_timestamp, pg_to_chrono_fmt,
47};
48pub use uuid::parse_uuid_bytes;
49use uuid::{generate_random_uuid, generate_uuid_v7};
50mod binary;
51mod casting;
52pub mod composites;
53mod conversion;
54mod current_time;
55pub mod enums;
56pub(crate) mod hashing;
57mod scalar_array;
58mod scalar_core;
59mod scalar_dispatch;
60mod scalar_geospatial;
61mod scalar_helpers;
62mod scalar_json;
63mod scalar_math;
64mod scalar_postgres;
65mod scalar_range;
66mod scalar_temporal;
67mod session_settings;
68mod session_sleep;
69mod temporal_input;
70mod value_catalog;
71pub mod variadic_any;
72pub use value_catalog::{EngineValueCatalog, SQLValueCatalog};
73
74#[cfg(test)]
75use binary::eval_comparison_op;
76pub use binary::{
77    compare_grouping_values_with_enum_catalog, compare_nullable_with_control,
78    compare_typed_values_with_control, compare_typed_values_with_enum_catalog,
79    compare_with_control, equal_typed_values_with_enum_catalog, eval_binary_values,
80    eval_binary_values_with_control, eval_binary_values_with_integer_width,
81    eval_binary_values_with_integer_width_with_control, eval_comparison_truth,
82    eval_comparison_truth_with_control, eval_comparison_truth_with_deferred_state,
83    eval_comparison_truth_with_engine, eval_comparison_truth_with_enum_catalog,
84    integer_width_for_literal, integer_width_for_type, truthy, type_comparison_can_fail,
85    validate_legacy_vector_comparison, value_comparison_can_fail,
86    values_equal_nullable_with_control, values_equal_with_control, IntegerWidth,
87};
88pub(crate) use binary::{datetime_out_of_range, division_by_zero, out_of_range};
89pub use casting::{
90    array_dimensions, cast_value, cast_value_from, cast_value_from_with_control,
91    invalid_boolean_input, negate_value, negate_value_with_control, parse_boolean_input,
92    parse_pg_array_literal, parse_pg_array_literal_with_control,
93};
94use conversion::{
95    allocation_error, float_to_i64_rounded, float_to_i64_trunc, nonnegative_usize, to_decimal,
96    to_i64,
97};
98pub use conversion::{
99    array_value_to_string, catalog_output_required, invalid_numeric_input, value_to_string,
100    value_to_string_with_control, vector_value_to_string,
101};
102pub(crate) use conversion::{tensor_items, vector_element, vector_items};
103pub use conversion::{
104    value_to_tensor, value_to_tensor_with_control, value_to_vector, value_to_vector_with_control,
105};
106pub(crate) use current_time::transaction_timestamp_or_clock;
107pub use current_time::{clock_timestamp_micros, transaction_clock_micros, TransactionClockScope};
108pub use floating::{
109    eval_float_arithmetic, eval_float_arithmetic_with_control, format_real, FloatWidth,
110};
111pub use in_range::in_range;
112#[cfg(test)]
113use scalar_dispatch::eval_scalar_function;
114use scalar_helpers::{point_xy, typeof_value};
115pub use scalar_helpers::{quote_ident, CompiledLikePattern};
116pub use temporal_input::{
117    temporal_date_order, DateOrderScope, TemporalInputContext, TemporalInputScope,
118};
119
120mod builtin;
121mod call_arguments;
122mod call_dispatch;
123mod context;
124mod diagnostics;
125mod evaluator;
126
127pub use builtin::{
128    bound_scalar_function_strictness, builtin_scalar_function_strictness,
129    eval_bound_builtin_function_call,
130};
131pub use call_arguments::{
132    call_argument_value, evaluate_call_args, validate_named_argument_order,
133    validate_named_argument_order_with_control, variadic_argument_value, wrap_variadic_argument,
134};
135pub use call_dispatch::{
136    eval_builtin_function_call, eval_builtin_function_call_with_control, eval_function_call,
137    eval_generated_function_call_with_control,
138};
139pub use context::{
140    cast_value_with_type_resolution, cast_value_with_type_resolution_with_control,
141    coercion_type_name, format_regtype_value, format_regtype_value_with_control,
142    read_catalog_array_input, read_catalog_input, CatalogInputFunctions, EngineHook, EvalContext,
143    RowLookup,
144};
145pub(crate) use context::{requires_catalog_constant_input, requires_domain_array_input};
146pub use diagnostics::{unknown_function_error, value_type_name};
147pub use evaluator::eval;
148mod numeric_operator;
149pub use numeric_operator::{eval_numeric_operator, eval_numeric_operator_with_control};
150
151#[cfg(test)]
152mod tests;
153
154mod json_carrier;
155pub use json_carrier::{core_value_to_json, value_to_text, value_to_text_with_control};