osirisdb 0.7.0

A SQL database engine built from scratch in Rust featuring a custom parser, binder, query planner, optimizer, catalog, and storage engine.
Documentation
use crate::lexer::token::{Modifier, TokenKind};

/// Maps an identifier string (case-insensitive) to its corresponding SQL keyword `TokenKind`.
///
/// Returns `TokenKind::Ident` if the identifier is not a reserved or contextual keyword.
pub fn lookup_keyword(word: &str) -> TokenKind {
    match word.to_uppercase().as_str() {
        // ── DML ──
        "SELECT" => TokenKind::Select,
        "FROM" => TokenKind::From,
        "WHERE" => TokenKind::Where,
        "INSERT" => TokenKind::Insert,
        "INTO" => TokenKind::Into,
        "VALUES" => TokenKind::Values,
        "UPDATE" => TokenKind::Update,
        "SET" => TokenKind::Set,
        "DELETE" => TokenKind::Delete,
        "RETURNING" => TokenKind::Returning,
        "MERGE" => TokenKind::Merge,

        // ── DDL ──
        "CREATE" => TokenKind::Create,
        "DATABASE" => TokenKind::Database,
        "CONNECTION" => TokenKind::Connection,
        "ENCODING" => TokenKind::Encoding,
        "LOCALE" => TokenKind::Locale,
        "TABLE" => TokenKind::Table,
        "TABLES" => TokenKind::Tables,
        "SCHEMA" => TokenKind::Schema,
        "AUTHORIZATION" => TokenKind::Authorization,
        "DROP" => TokenKind::Drop,
        "USE" => TokenKind::Use,
        "TRUNCATE" => TokenKind::Truncate,
        "ALTER" => TokenKind::Alter,
        "RESET" => TokenKind::Reset,
        "RESTART" => TokenKind::Restart,
        "IDENTITY" => TokenKind::Identity,
        "CONTINUE" => TokenKind::Continue,
        "INDEX" => TokenKind::Index,
        "VIEW" => TokenKind::View,
        "ADD" => TokenKind::Add,
        "ATTACH" => TokenKind::Attach,
        "COLUMN" => TokenKind::Column,
        "RENAME" => TokenKind::Rename,
        "TO" => TokenKind::To,
        "OWNER" => TokenKind::Owner,
        "TYPE" => TokenKind::Type,
        "STATISTICS" => TokenKind::Statistics,
        "STORAGE" => TokenKind::Storage,
        "OPTIONS" => TokenKind::Options,
        "DATA" => TokenKind::Data,
        "ROLE" => TokenKind::Role,
        "USER" => TokenKind::User,
        "LOGIN" => TokenKind::Login,
        "NOLOGIN" => TokenKind::NoLogin,
        "PASSWORD" => TokenKind::Password,
        "SUPERUSER" => TokenKind::Superuser,
        "NOSUPERUSER" => TokenKind::NoSuperuser,
        "REPLICATION" => TokenKind::Replication,
        "NOREPLICATION" => TokenKind::NoReplication,
        "VALID" => TokenKind::Valid,
        "UNTIL" => TokenKind::Until,
        "CREATEDB" => TokenKind::CreateDb,
        "NOCREATEDB" => TokenKind::NoCreateDb,
        "CREATEROLE" => TokenKind::CreateRole,
        "NOCREATEROLE" => TokenKind::NoCreateRole,
        "NOINHERIT" => TokenKind::NoInherit,
        "EXTENSION" => TokenKind::Extension,
        "VERSION" => TokenKind::Version,

        // ── Constraints & References ──
        "CONSTRAINT" => TokenKind::Constraint,
        "PRIMARY" => TokenKind::Primary,
        "KEY" => TokenKind::Key,
        "FOREIGN" => TokenKind::Foreign,
        "REFERENCES" => TokenKind::References,
        "UNIQUE" => TokenKind::Unique,
        "CHECK" => TokenKind::Check,
        "NOT" => TokenKind::Not,
        "NULL" => TokenKind::Null,
        "DEFAULT" => TokenKind::Default,
        "CASCADE" => TokenKind::Cascade,
        "RESTRICT" => TokenKind::Restrict,
        "ACTION" => TokenKind::Action,

        // ── Logical & Comparison ──
        "AND" => TokenKind::And,
        "OR" => TokenKind::Or,
        "IN" => TokenKind::In,
        "OUT" => TokenKind::Out,
        "LIKE" => TokenKind::Like,
        "ILIKE" => TokenKind::Ilike,
        "SIMILAR" => TokenKind::Similar,
        "BETWEEN" => TokenKind::Between,
        "IS" => TokenKind::Is,
        "EXISTS" => TokenKind::Exists,
        "ANY" => TokenKind::Any,
        "SOME" => TokenKind::Some,
        "ESCAPE" => TokenKind::Escape,

        // ── Boolean Literals ──
        "TRUE" => TokenKind::True,
        "FALSE" => TokenKind::False,

        // ── Grouping, Ordering & Pagination ──
        "GROUP" => TokenKind::Group,
        "ORDER" => TokenKind::Order,
        "BY" => TokenKind::By,
        "HAVING" => TokenKind::Having,
        "LIMIT" => TokenKind::Limit,
        "OFFSET" => TokenKind::Offset,
        "ASC" => TokenKind::Asc,
        "DESC" => TokenKind::Desc,
        "DISTINCT" => TokenKind::Distinct,
        "ALL" => TokenKind::All,
        "NULLS" => TokenKind::Nulls,
        "FIRST" => TokenKind::First,
        "LAST" => TokenKind::Last,
        "FETCH" => TokenKind::Fetch,
        "NEXT" => TokenKind::Next,
        "PERCENT" => TokenKind::PercentKw,
        "TIE" => TokenKind::Tie,
        "TIES" => TokenKind::Ties,

        // ── Set Operations ──
        "UNION" => TokenKind::Union,
        "INTERSECT" => TokenKind::Intersect,
        "EXCEPT" => TokenKind::Except,

        // ── Transaction ──
        "BEGIN" => TokenKind::Begin,
        "COMMIT" => TokenKind::Commit,
        "ROLLBACK" => TokenKind::Rollback,
        "TRANSACTION" => TokenKind::Transaction,
        "SAVEPOINT" => TokenKind::Savepoint,
        "RELEASE" => TokenKind::Release,

        // ── CTE & Conditional ──
        "WITH" => TokenKind::With,
        "RECURSIVE" => TokenKind::Recursive,
        "CASE" => TokenKind::Case,
        "WHEN" => TokenKind::When,
        "THEN" => TokenKind::Then,
        "ELSE" => TokenKind::Else,
        "END" => TokenKind::End,
        "CAST" => TokenKind::Cast,
        "IF" => TokenKind::If,

        // ── Joins ──
        "JOIN" => TokenKind::Join,
        "ON" => TokenKind::On,
        "AS" => TokenKind::As,
        "INNER" => TokenKind::Inner,
        "LEFT" => TokenKind::Left,
        "RIGHT" => TokenKind::Right,
        "FULL" => TokenKind::Full,
        "CROSS" => TokenKind::Cross,
        "OUTER" => TokenKind::Outer,
        "NATURAL" => TokenKind::Natural,
        "USING" => TokenKind::Using,
        "LATERAL" => TokenKind::Lateral,

        // ── Table Options & Clauses ──
        "INHERITS" => TokenKind::Inherits,
        "INHERIT" => TokenKind::Inherit,
        "PARTITION" => TokenKind::Partition,
        "RANGE" => TokenKind::Range,
        "LIST" => TokenKind::List,
        "HASH" => TokenKind::Hash,
        "TABLESPACE" => TokenKind::Tablespace,
        "LOCATION" => TokenKind::Location,
        "COLLATE" => TokenKind::Collate,
        "GENERATED" => TokenKind::Generated,
        "ALWAYS" => TokenKind::Always,
        "STORED" => TokenKind::Stored,
        "AUTOINCREMENT" => TokenKind::AutoIncrement,
        "DETACH" => TokenKind::Detach,
        "MINVALUE" => TokenKind::Minvalue,
        "MAXVALUE" => TokenKind::Maxvalue,

        // ── ON COMMIT Options ──
        "PRESERVE" => TokenKind::Preserve,
        "ROWS" => TokenKind::Rows,

        // ── Utility ──
        "EXPLAIN" => TokenKind::Explain,
        "ANALYZE" => TokenKind::Analyze,
        "DESCRIBE" => TokenKind::Describe,
        "SHOW" => TokenKind::Show,
        "COPY" => TokenKind::Copy,
        "VACUUM" => TokenKind::Vacuum,

        // ── Locking ──
        "FOR" => TokenKind::For,
        "SHARE" => TokenKind::Share,
        "NO" => TokenKind::No,
        "WAIT" => TokenKind::Wait,
        "SKIP" => TokenKind::Skip,
        "LOCKED" => TokenKind::Locked,
        "ONLY" => TokenKind::Only,

        // ── Window Functions ──
        "OVER" => TokenKind::Over,
        "FILTER" => TokenKind::Filter,
        "WINDOW" => TokenKind::Window,
        "PRECEDING" => TokenKind::Preceding,
        "FOLLOWING" => TokenKind::Following,
        "CURRENT" => TokenKind::Current,
        "ROW" => TokenKind::Row,
        "UNBOUNDED" => TokenKind::Unbounded,

        // ── UPSERT / Conflict ──
        "CONFLICT" => TokenKind::Conflict,
        "DO" => TokenKind::Do,
        "NOTHING" => TokenKind::Nothing,
        "EXCLUDED" => TokenKind::Excluded,

        // ── Sequence ──
        "SEQUENCE" => TokenKind::Sequence,
        "START" => TokenKind::Start,
        "INCREMENT" => TokenKind::Increment,
        "CACHE" => TokenKind::Cache,
        "CYCLE" => TokenKind::Cycle,
        "OWNED" => TokenKind::Owned,

        // ── Data Type Contextual Keywords ──
        "VARYING" => TokenKind::Varying,
        "PRECISION" => TokenKind::Precision,
        "ZONE" => TokenKind::Zone,
        "TIME" => TokenKind::Time,
        "ENUM" => TokenKind::Enum,
        "DOMAIN" => TokenKind::Domain,
        "BASE" => TokenKind::Base,
        "SUBTYPE" => TokenKind::Subtype,
        "CANONICAL" => TokenKind::Canonical,
        "PREFERRED" => TokenKind::Preferred,

        // ── Triggers ──
        "TRIGGER" => TokenKind::Trigger,
        "BEFORE" => TokenKind::Before,
        "AFTER" => TokenKind::After,
        "INSTEAD" => TokenKind::Instead,
        "EACH" => TokenKind::Each,
        "EXECUTE" => TokenKind::Execute,
        "PROCEDURE" => TokenKind::Procedure,
        "TIMEOUT" => TokenKind::Timeout,
        "IDEMPOTENT" => TokenKind::Idempotent,
        "RETRIES" => TokenKind::Retries,
        "CONTROL" => TokenKind::Control,
        "DEFERRABLE" => TokenKind::Deferrable,
        "INITIALLY" => TokenKind::Initially,
        "DEFERRED" => TokenKind::Deferred,
        "IMMEDIATE" => TokenKind::Immediate,
        "REFERENCING" => TokenKind::Referencing,
        "OLD" => TokenKind::Old,
        "NEW" => TokenKind::New,
        "OF" => TokenKind::Of,
        "STATEMENT" => TokenKind::Statement,
        "FUNCTION" => TokenKind::Function,
        "RETURNS" => TokenKind::Returns,
        "LANGUAGE" => TokenKind::Language,
        "VOLATILE" => TokenKind::Volatile,
        "STABLE" => TokenKind::Stable,
        "IMMUTABLE" => TokenKind::Immutable,
        "STRICT" => TokenKind::Strict,
        "PARALLEL" => TokenKind::Parallel,
        "SAFE" => TokenKind::Safe,
        "UNSAFE" => TokenKind::Unsafe,
        "RESTRICTED" => TokenKind::Restricted,
        "VARIADIC" => TokenKind::Variadic,
        "INOUT" => TokenKind::Inout,
        "SETOF" => TokenKind::Setof,
        "RAISES" => TokenKind::Raises,
        "ACCESS" => TokenKind::Access,
        "DEFINER" => TokenKind::Definer,
        "INVOKER" => TokenKind::Invoker,
        "COST" => TokenKind::Cost,
        "CALLED" => TokenKind::Called,
        "INPUT" => TokenKind::Input,
        "SECURITY" => TokenKind::Security,
        "PUBLIC" => TokenKind::Public,
        "PRIVATE" => TokenKind::Private,
        "VOID" => TokenKind::Void,
        "INT" => TokenKind::Int,
        "INTEGER" => TokenKind::Integer,
        "INT2" => TokenKind::Int2,
        "INT4" => TokenKind::Int4,
        "INT8" => TokenKind::Int8,
        "BIGINT" => TokenKind::Bigint,
        "SMALLINT" => TokenKind::Smallint,
        "BOOLEAN" => TokenKind::Boolean,
        "BOOL" => TokenKind::Bool,
        "TEXT" => TokenKind::Text,
        "VARCHAR" => TokenKind::Varchar,
        "CHAR" => TokenKind::Char,
        "CHARACTER" => TokenKind::Character,
        "REAL" => TokenKind::Real,
        "DOUBLE" => TokenKind::Double,
        "FLOAT" => TokenKind::Float,
        "FLOAT4" => TokenKind::Float4,
        "FLOAT8" => TokenKind::Float8,
        "NUMERIC" => TokenKind::Numeric,
        "DECIMAL" => TokenKind::Decimal,
        "BINARY" => TokenKind::Binary,
        "VARBINARY" => TokenKind::VarBinary,
        "DATE" => TokenKind::Date,
        "TIMESTAMP" => TokenKind::Timestamp,
        "TIMESTAMPTZ" => TokenKind::Timestamptz,
        "INTERVAL" => TokenKind::Interval,
        "JSON" => TokenKind::Json,
        "JSONB" => TokenKind::Jsonb,
        "UUID" => TokenKind::Uuid,
        "BYTEA" => TokenKind::Bytea,

        // ── Trigger Extensions ──
        "PRIORITY" => TokenKind::Priority,
        "TAGS" => TokenKind::Tags,
        "ENABLED" => TokenKind::Enabled,
        "DISABLED" => TokenKind::Disabled,

        // ── Modifiers ──
        "TEMPORARY" => TokenKind::Modifier(Modifier::Temporary),
        "TEMP" => TokenKind::Modifier(Modifier::Temp),
        "UNLOGGED" => TokenKind::Modifier(Modifier::Unlogged),
        "GLOBAL" => TokenKind::Modifier(Modifier::Global),
        "LOCAL" => TokenKind::Modifier(Modifier::Local),
        "MATERIALIZED" => TokenKind::Modifier(Modifier::Materialized),
        "REPLACE" => TokenKind::Modifier(Modifier::Replace),

        // ── Fallback: identifier ──
        _ => TokenKind::Ident,
    }
}