From 0339558d4e9208b0700b347f75ebd02993e834dd Mon Sep 17 00:00:00 2001 From: Andy Grove Date: Sat, 1 Sep 2018 06:51:00 -0600 Subject: [PATCH] Add most of the SQL:2011 data types --- README.md | 2 +- src/parser.rs | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 21e82313..b7abbf38 100644 --- a/README.md +++ b/README.md @@ -8,5 +8,5 @@ Goals for this version: - Good error reporting (e.g. show line / column numbers and descriptive messages) - Zero-copy of tokens when parsing - Concise code - +- Full support for ANSI SQL:2011 standard diff --git a/src/parser.rs b/src/parser.rs index 3c23a0b9..f75cdca4 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -3,6 +3,57 @@ use std::fmt::Debug; use super::tokenizer::*; +// https://jakewheat.github.io/sql-overview/sql-2011-foundation-grammar.html + +/// ANSI SQL:2011 Data Types +#[derive(Debug)] +pub enum SQLDataType { + /// BOOLEAN + Boolean, + /// NUMERIC, DECIMAL, DEC + Numeric { precision: usize, scale: Option }, + /// SMALLINT + SmallInt, + /// INT, INTEGER + Int, + /// BIGINT + BigInt, + /// Floating point: `FLOAT(precision)` + Float(usize), + /// REAL + Real, + /// Double: `DOUBLE PRECISION` + Double, + /// Fixed-length character. `CHAR, CHARACTER` + Char(usize), + /// Variable-length character: `VARCHAR, CHARACTER VARYING, CHAR VARYING` + VarChar(usize), + /// Character Large Object: `CHARACTER LARGE OBJECT, CHAR LARGE OBJECT, CLOB` + Clob(usize), + /// Fixed-length character. `NCHAR, NATIONAL CHAR, NATIONAL CHARACTER` + NChar(usize), + /// Variable-length character: `NCHAR VARYING, NATIONAL CHARACTER VARYING, NATIONAL CHAR VARYING` + NVarChar(usize), + /// National Character Large Object: `NATIONAL CHARACTER LARGE OBJECT, NCHAR LARGE OBJECT, NCLOB` + NClob(usize), + /// Fixed-length binary + Binary(usize), + /// Variable-length binary + VarBinary(usize), + /// Binary large object + Blob(usize), + /// Date + Date, + /// Time: `TIME [(precision)] [WITH TIME ZONE | WITHOUT TIME ZONE]` + Time { precision: usize, tz: bool }, + /// Time: `TIMESTAMP [(precision)] [WITH TIME ZONE | WITHOUT TIME ZONE]` + Timestamp { precision: usize, tz: bool }, + /// Custom data type + Custom(T) +} + + + #[derive(Debug)] pub enum SQLOperator { Plus,