Skip to main content

qail_pg/protocol/
error.rs

1//! Encoding errors for PostgreSQL wire protocol.
2//!
3//! Shared by `PgEncoder` and `AstEncoder`.
4
5use std::fmt;
6
7use qail_core::ast::Action;
8
9/// Errors that can occur during wire protocol encoding.
10#[derive(Debug, Clone, PartialEq, Eq)]
11pub enum EncodeError {
12    /// A string value contains a literal NULL byte (0x00).
13    NullByte,
14    /// Too many parameters for the protocol (limit is i16::MAX = 32767).
15    TooManyParameters(usize),
16    /// A single parameter or message exceeds i32::MAX bytes.
17    MessageTooLarge(usize),
18    /// Execute `max_rows` must be non-negative (0 means unlimited).
19    InvalidMaxRows(i32),
20    /// Action not supported by the AST-native encoder (e.g. Listen, Search).
21    UnsupportedAction(Action),
22    /// A Value::Function/expression contains SQL injection markers.
23    UnsafeExpression(String),
24}
25
26impl fmt::Display for EncodeError {
27    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
28        match self {
29            EncodeError::NullByte => {
30                write!(
31                    f,
32                    "Value contains NULL byte (0x00) which is invalid in PostgreSQL"
33                )
34            }
35            EncodeError::TooManyParameters(count) => {
36                write!(f, "Too many parameters: {} (Limit is 32767)", count)
37            }
38            EncodeError::MessageTooLarge(size) => {
39                write!(
40                    f,
41                    "Message too large: {} bytes (Limit is {})",
42                    size,
43                    i32::MAX
44                )
45            }
46            EncodeError::InvalidMaxRows(v) => {
47                write!(f, "Invalid Execute max_rows: {} (must be >= 0)", v)
48            }
49            EncodeError::UnsupportedAction(action) => {
50                write!(f, "Unsupported action {:?} in AST-native encoder", action)
51            }
52            EncodeError::UnsafeExpression(expr) => {
53                write!(f, "Unsafe expression rejected: {}", expr)
54            }
55        }
56    }
57}
58
59impl std::error::Error for EncodeError {}