Skip to main content

SqliteFunctionBehavior

Struct SqliteFunctionBehavior 

Source
pub struct SqliteFunctionBehavior(/* private fields */);
Available on crate feature __sqlite-shared only.
Expand description

Flags controlling SQLite custom function behavior.

These flags are passed to sqlite3_create_function_v2() and control how SQLite treats the function in various contexts.

§Availability

§Security Considerations

When using SqliteConnection::set_trusted_schema(false) for security hardening, custom functions must be marked with INNOCUOUS to be callable from views, triggers, CHECK constraints, DEFAULT expressions, generated columns, and expression indexes.

Conversely, functions with side effects or that expose sensitive state should be marked with DIRECTONLY to prevent them from being called via malicious schema objects in untrusted database files.

§Example

use diesel::sqlite::SqliteFunctionBehavior;

// Deterministic function (most common case)
let flags = SqliteFunctionBehavior::DETERMINISTIC;
assert!(flags.contains(SqliteFunctionBehavior::DETERMINISTIC));

// Non-deterministic function (e.g., random())
let flags = SqliteFunctionBehavior::empty();
assert!(flags.is_empty());

// Safe for use in untrusted schemas (views, triggers, etc.)
let flags = SqliteFunctionBehavior::DETERMINISTIC | SqliteFunctionBehavior::INNOCUOUS;
assert!(flags.contains(SqliteFunctionBehavior::DETERMINISTIC));
assert!(flags.contains(SqliteFunctionBehavior::INNOCUOUS));

// Has side effects, block from schema objects
let flags = SqliteFunctionBehavior::DIRECTONLY;
assert!(flags.contains(SqliteFunctionBehavior::DIRECTONLY));

When registering a custom SQL function:

use diesel::sqlite::SqliteFunctionBehavior;
use diesel::prelude::*;

// Use SqliteFunctionBehavior when registering SQL functions
conn.register_sql_function::<diesel::sql_types::Text, diesel::sql_types::Text, _, _, _>(
    "my_upper",
    SqliteFunctionBehavior::DETERMINISTIC | SqliteFunctionBehavior::INNOCUOUS,
    |x: String| x.to_uppercase(),
)?;

Implementations§

Source§

impl SqliteFunctionBehavior

Source

pub const DETERMINISTIC: Self

The function always returns the same result given the same inputs within a single SQL statement.

This allows SQLite to optimize by caching results and factoring the function out of inner loops. Most pure functions should use this flag.

§Availability

Requires SQLite 3.8.3 (2014-02) or later.

§Example

abs(x) is deterministic. random() is not.

Source

pub const DIRECTONLY: Self

The function cannot be called from schema objects (views, triggers, CHECK constraints, DEFAULT expressions, generated columns, or expression indexes).

Use this for functions that:

  • Have side effects (network, file I/O, logging, etc.)
  • Return sensitive application state
  • Should not be triggered by opening an untrusted database
§Availability

Requires SQLite 3.31.0 (2020-01) or later.

§Security Recommendation

Mark all functions with side effects or that expose internal state with DIRECTONLY to prevent schema injection attacks.

Source

pub const INNOCUOUS: Self

The function is safe to call from untrusted schema contexts.

When SqliteConnection::set_trusted_schema(false) is set, only functions marked INNOCUOUS can be called from schema objects (views, triggers, CHECK constraints, DEFAULT expressions, generated columns, expression indexes).

§Availability

Requires SQLite 3.31.0 (2020-01) or later.

§Safety Requirements

Only mark a function as INNOCUOUS if it:

  • Has no side effects
  • Does not reveal internal application state
  • Output depends solely on its input parameters
§Security Warning

Incorrectly marking a function as INNOCUOUS can create security vulnerabilities when processing untrusted database files. An attacker could craft a database with malicious views or triggers that invoke your function in unexpected ways.

Source

pub const SUBTYPE: Self

The function may call sqlite3_value_subtype() to inspect the subtype of its arguments.

§Availability

Requires SQLite 3.30.0 (2019-10) or later.

Source§

impl SqliteFunctionBehavior

Source

pub const fn empty() -> Self

Get a flags value with all bits unset.

Source

pub const fn all() -> Self

Get a flags value with all known bits set.

Source

pub const fn bits(&self) -> i32

Get the underlying bits value.

The returned value is exactly the bits set in this flags value.

Source

pub const fn from_bits(bits: i32) -> Option<Self>

Convert from a bits value.

This method will return None if any unknown bits are set.

Source

pub const fn from_bits_truncate(bits: i32) -> Self

Convert from a bits value, unsetting any unknown bits.

Source

pub const fn from_bits_retain(bits: i32) -> Self

Convert from a bits value exactly.

Source

pub fn from_name(name: &str) -> Option<Self>

Get a flags value with the bits of a flag with the given name set.

This method will return None if name is empty or doesn’t correspond to any named flag.

Source

pub const fn is_empty(&self) -> bool

Whether all bits in self are unset.

Source

pub const fn is_all(&self) -> bool

Whether all known bits in this flags value are set.

Source

pub const fn intersects(&self, other: Self) -> bool

Whether any set bits in other are also set in self.

Source

pub const fn contains(&self, other: Self) -> bool

Whether all set bits in other are also set in self.

Source

pub fn insert(&mut self, other: Self)

The bitwise or (|) of the bits in self and other.

Source

pub fn remove(&mut self, other: Self)

The intersection of self with the complement of other (&!).

This method is not equivalent to self & !other when other has unknown bits set. remove won’t truncate other, but the ! operator will.

Source

pub fn toggle(&mut self, other: Self)

The bitwise exclusive-or (^) of the bits in self and other.

Source

pub fn set(&mut self, other: Self, value: bool)

Call insert when value is true or remove when value is false.

Source

pub const fn intersection(self, other: Self) -> Self

The bitwise and (&) of the bits in self and other.

Source

pub const fn union(self, other: Self) -> Self

The bitwise or (|) of the bits in self and other.

Source

pub const fn difference(self, other: Self) -> Self

The intersection of self with the complement of other (&!).

This method is not equivalent to self & !other when other has unknown bits set. difference won’t truncate other, but the ! operator will.

Source

pub const fn symmetric_difference(self, other: Self) -> Self

The bitwise exclusive-or (^) of the bits in self and other.

Source

pub const fn complement(self) -> Self

The bitwise negation (!) of the bits in self, truncating the result.

Source§

impl SqliteFunctionBehavior

Source

pub const fn iter(&self) -> Iter<SqliteFunctionBehavior>

Yield a set of contained flags values.

Each yielded flags value will correspond to a defined named flag. Any unknown bits will be yielded together as a final flags value.

Source

pub const fn iter_names(&self) -> IterNames<SqliteFunctionBehavior>

Yield a set of contained named flags values.

This method is like iter, except only yields bits in contained named flags. Any unknown bits, or bits not corresponding to a contained flag will not be yielded.

Trait Implementations§

Source§

impl Binary for SqliteFunctionBehavior

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl BitAnd for SqliteFunctionBehavior

Source§

fn bitand(self, other: Self) -> Self

The bitwise and (&) of the bits in self and other.

Source§

type Output = SqliteFunctionBehavior

The resulting type after applying the & operator.
Source§

impl BitAndAssign for SqliteFunctionBehavior

Source§

fn bitand_assign(&mut self, other: Self)

The bitwise and (&) of the bits in self and other.

Source§

impl BitOr for SqliteFunctionBehavior

Source§

fn bitor(self, other: SqliteFunctionBehavior) -> Self

The bitwise or (|) of the bits in self and other.

Source§

type Output = SqliteFunctionBehavior

The resulting type after applying the | operator.
Source§

impl BitOrAssign for SqliteFunctionBehavior

Source§

fn bitor_assign(&mut self, other: Self)

The bitwise or (|) of the bits in self and other.

Source§

impl BitXor for SqliteFunctionBehavior

Source§

fn bitxor(self, other: Self) -> Self

The bitwise exclusive-or (^) of the bits in self and other.

Source§

type Output = SqliteFunctionBehavior

The resulting type after applying the ^ operator.
Source§

impl BitXorAssign for SqliteFunctionBehavior

Source§

fn bitxor_assign(&mut self, other: Self)

The bitwise exclusive-or (^) of the bits in self and other.

Source§

impl Clone for SqliteFunctionBehavior

Source§

fn clone(&self) -> SqliteFunctionBehavior

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for SqliteFunctionBehavior

Source§

impl Debug for SqliteFunctionBehavior

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SqliteFunctionBehavior

Source§

fn default() -> Self

Returns Self::empty()

Source§

impl Eq for SqliteFunctionBehavior

Source§

impl Extend<SqliteFunctionBehavior> for SqliteFunctionBehavior

Source§

fn extend<T: IntoIterator<Item = Self>>(&mut self, iterator: T)

The bitwise or (|) of the bits in each flags value.

Source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
Source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
Source§

impl Flags for SqliteFunctionBehavior

Source§

const FLAGS: &'static [Flag<SqliteFunctionBehavior>]

The set of defined flags.
Source§

type Bits = i32

The underlying bits type.
Source§

fn bits(&self) -> i32

Get the underlying bits value. Read more
Source§

fn from_bits_retain(bits: i32) -> SqliteFunctionBehavior

Convert from a bits value exactly.
Source§

fn all_named() -> SqliteFunctionBehavior

Get a flags value with all bits from named flags set. Read more
Source§

fn empty() -> Self

Get a flags value with all bits unset.
Source§

fn all() -> Self

Get a flags value with all known bits set.
Source§

fn known_bits(&self) -> Self::Bits

Get the known bits from a flags value.
Source§

fn unknown_bits(&self) -> Self::Bits

Get the unknown bits from a flags value.
Source§

fn contains_unknown_bits(&self) -> bool

This method will return true if any unknown bits are set.
Source§

fn from_bits(bits: Self::Bits) -> Option<Self>

Convert from a bits value. Read more
Source§

fn from_bits_truncate(bits: Self::Bits) -> Self

Convert from a bits value, unsetting any unknown bits.
Source§

fn from_name(name: &str) -> Option<Self>

Get a flags value with the bits of a flag with the given name set. Read more
Source§

fn iter(&self) -> Iter<Self>

Yield a set of contained flags values. Read more
Source§

fn iter_names(&self) -> IterNames<Self>

Yield a set of contained named flags values. Read more
Source§

fn iter_defined_names() -> IterDefinedNames<Self>

Yield a set of all named flags defined by Self::FLAGS.
Source§

fn iter_equal_names(&self) -> IterEqualNames<Self>

Get an iterator over all defined names for this flags value. Read more
Source§

fn is_empty(&self) -> bool

Whether all bits in this flags value are unset.
Source§

fn is_all(&self) -> bool

Whether all known bits in this flags value are set.
Source§

fn intersects(&self, other: Self) -> bool
where Self: Sized,

Whether any set bits in other are also set in self.
Source§

fn contains(&self, other: Self) -> bool
where Self: Sized,

Whether all set bits in other are also set in self.
Source§

fn truncate(&mut self)
where Self: Sized,

Remove any unknown bits from the flags.
Source§

fn insert(&mut self, other: Self)
where Self: Sized,

The bitwise or (|) of the bits in self and other.
Source§

fn remove(&mut self, other: Self)
where Self: Sized,

The intersection of self with the complement of other (&!). Read more
Source§

fn toggle(&mut self, other: Self)
where Self: Sized,

The bitwise exclusive-or (^) of the bits in self and other.
Source§

fn set(&mut self, other: Self, value: bool)
where Self: Sized,

Call Flags::insert when value is true or Flags::remove when value is false.
Source§

fn clear(&mut self)
where Self: Sized,

Unsets all bits in the flags.
Source§

fn intersection(self, other: Self) -> Self

The bitwise and (&) of the bits in self and other.
Source§

fn union(self, other: Self) -> Self

The bitwise or (|) of the bits in self and other.
Source§

fn difference(self, other: Self) -> Self

The intersection of self with the complement of other (&!). Read more
Source§

fn symmetric_difference(self, other: Self) -> Self

The bitwise exclusive-or (^) of the bits in self and other.
Source§

fn complement(self) -> Self

The bitwise negation (!) of the bits in self, truncating the result.
Source§

impl FromIterator<SqliteFunctionBehavior> for SqliteFunctionBehavior

Source§

fn from_iter<T: IntoIterator<Item = Self>>(iterator: T) -> Self

The bitwise or (|) of the bits in each flags value.

Source§

impl Hash for SqliteFunctionBehavior

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl IntoIterator for SqliteFunctionBehavior

Source§

type Item = SqliteFunctionBehavior

The type of the elements being iterated over.
Source§

type IntoIter = Iter<SqliteFunctionBehavior>

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
Source§

impl LowerHex for SqliteFunctionBehavior

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Not for SqliteFunctionBehavior

Source§

fn not(self) -> Self

The bitwise negation (!) of the bits in self, truncating the result.

Source§

type Output = SqliteFunctionBehavior

The resulting type after applying the ! operator.
Source§

impl Octal for SqliteFunctionBehavior

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for SqliteFunctionBehavior

Source§

fn eq(&self, other: &SqliteFunctionBehavior) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PublicFlags for SqliteFunctionBehavior

Source§

type Primitive = i32

The type of the underlying storage.
Source§

type Internal = InternalBitFlags

The type of the internal field on the generated flags type.
Source§

impl StructuralPartialEq for SqliteFunctionBehavior

Source§

impl Sub for SqliteFunctionBehavior

Source§

fn sub(self, other: Self) -> Self

The intersection of self with the complement of other (&!).

This method is not equivalent to self & !other when other has unknown bits set. difference won’t truncate other, but the ! operator will.

Source§

type Output = SqliteFunctionBehavior

The resulting type after applying the - operator.
Source§

impl SubAssign for SqliteFunctionBehavior

Source§

fn sub_assign(&mut self, other: Self)

The intersection of self with the complement of other (&!).

This method is not equivalent to self & !other when other has unknown bits set. difference won’t truncate other, but the ! operator will.

Source§

impl UpperHex for SqliteFunctionBehavior

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> AggregateExpressionMethods for T

Source§

fn aggregate_distinct(self) -> AggregateDistinct<Self>
where Self: DistinctDsl,

DISTINCT modifier for aggregate functions Read more
Source§

fn aggregate_all(self) -> AggregateAll<Self>
where Self: AllDsl,

ALL modifier for aggregate functions Read more
Source§

fn aggregate_filter<P>(self, f: P) -> AggregateFilter<Self, P>
where P: AsExpression<Bool>, Self: FilterDsl<P::Expression>,

Add an aggregate function filter Read more
Source§

fn aggregate_order<O>(self, o: O) -> AggregateOrder<Self, O>
where Self: OrderAggregateDsl<O>,

Add an aggregate function order Read more
Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoSql for T

Source§

fn into_sql<T>(self) -> AsExprOf<Self, T>

Convert self to an expression for Diesel’s query builder. Read more
Source§

fn as_sql<'a, T>(&'a self) -> AsExprOf<&'a Self, T>
where &'a Self: AsExpression<T>, T: SqlType + TypedExpressionType,

Convert &self to an expression for Diesel’s query builder. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WindowExpressionMethods for T

Source§

fn over(self) -> Over<Self>
where Self: OverDsl,

Turn a function call into a window function call Read more
Source§

fn window_filter<P>(self, f: P) -> WindowFilter<Self, P>
where P: AsExpression<Bool>, Self: FilterDsl<P::Expression>,

Add a filter to the current window function Read more
Source§

fn partition_by<E>(self, expr: E) -> PartitionBy<Self, E>
where Self: PartitionByDsl<E>,

Add a partition clause to the current window function Read more
Source§

fn window_order<E>(self, expr: E) -> WindowOrder<Self, E>
where Self: OrderWindowDsl<E>,

Add a order clause to the current window function Read more
Source§

fn frame_by<E>(self, expr: E) -> FrameBy<Self, E>
where Self: FrameDsl<E>,

Add a frame clause to the current window function Read more