Skip to content

Commit fb44aa9

Browse files
committed
issues-336 Init new Value type
1 parent 6a30dbc commit fb44aa9

File tree

16 files changed

+302
-1831
lines changed

16 files changed

+302
-1831
lines changed

src/backend/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//! Translating the SQL AST into engine-specific SQL statements.
22
33
use crate::*;
4+
use std::fmt::Write;
45

56
#[cfg(feature = "backend-mysql")]
67
#[cfg_attr(docsrs, doc(cfg(feature = "backend-mysql")))]

src/backend/mysql/table.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ impl TableBuilder for MysqlQueryBuilder {
122122
match column_spec {
123123
ColumnSpec::Null => write!(sql, "NULL"),
124124
ColumnSpec::NotNull => write!(sql, "NOT NULL"),
125-
ColumnSpec::Default(value) => write!(sql, "DEFAULT {}", self.value_to_string(value)),
125+
ColumnSpec::Default(value) => write!(sql, "DEFAULT {}", value.to_sql_string()),
126126
ColumnSpec::AutoIncrement => write!(sql, "AUTO_INCREMENT"),
127127
ColumnSpec::UniqueKey => write!(sql, "UNIQUE"),
128128
ColumnSpec::PrimaryKey => write!(sql, "PRIMARY KEY"),

src/backend/postgres/table.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,7 @@ impl TableBuilder for PostgresQueryBuilder {
111111
match column_spec {
112112
ColumnSpec::Null => write!(sql, "NULL"),
113113
ColumnSpec::NotNull => write!(sql, "NOT NULL"),
114-
ColumnSpec::Default(value) => {
115-
write!(sql, "DEFAULT {}", self.value_to_string(value))
116-
}
114+
ColumnSpec::Default(value) => write!(sql, "DEFAULT {}", value.to_sql_string()),
117115
ColumnSpec::AutoIncrement => write!(sql, ""),
118116
ColumnSpec::UniqueKey => write!(sql, "UNIQUE"),
119117
ColumnSpec::PrimaryKey => write!(sql, "PRIMARY KEY"),

src/backend/query_builder.rs

Lines changed: 4 additions & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -958,8 +958,7 @@ pub trait QueryBuilder: QuotedBuilder + EscapeBuilder + TableRefBuilder {
958958
write!(sql, " WHEN ").unwrap();
959959
self.prepare_simple_expr(&order_expr.expr, sql, collector);
960960
write!(sql, "=").unwrap();
961-
let value = self.value_to_string(value);
962-
write!(sql, "{}", value).unwrap();
961+
write!(sql, "{}", value.to_sql_string()).unwrap();
963962
write!(sql, " THEN {} ", i).unwrap();
964963
i += 1;
965964
}
@@ -975,8 +974,7 @@ pub trait QueryBuilder: QuotedBuilder + EscapeBuilder + TableRefBuilder {
975974

976975
/// Write [`Value`] inline.
977976
fn prepare_constant(&self, value: &Value, sql: &mut SqlWriter) {
978-
let string = self.value_to_string(value);
979-
write!(sql, "{}", string).unwrap();
977+
write!(sql, "{}", value.to_sql_string()).unwrap();
980978
}
981979

982980
/// Translate a `&[ValueTuple]` into a VALUES list.
@@ -1048,144 +1046,6 @@ pub trait QueryBuilder: QuotedBuilder + EscapeBuilder + TableRefBuilder {
10481046
}
10491047
}
10501048

1051-
/// Convert a SQL value into syntax-specific string
1052-
fn value_to_string(&self, v: &Value) -> String {
1053-
let mut s = String::new();
1054-
match v {
1055-
Value::Bool(None)
1056-
| Value::TinyInt(None)
1057-
| Value::SmallInt(None)
1058-
| Value::Int(None)
1059-
| Value::BigInt(None)
1060-
| Value::TinyUnsigned(None)
1061-
| Value::SmallUnsigned(None)
1062-
| Value::Unsigned(None)
1063-
| Value::BigUnsigned(None)
1064-
| Value::Float(None)
1065-
| Value::Double(None)
1066-
| Value::String(None)
1067-
| Value::Char(None)
1068-
| Value::Bytes(None) => write!(s, "NULL").unwrap(),
1069-
#[cfg(feature = "with-json")]
1070-
Value::Json(None) => write!(s, "NULL").unwrap(),
1071-
#[cfg(feature = "with-chrono")]
1072-
Value::ChronoDate(None) => write!(s, "NULL").unwrap(),
1073-
#[cfg(feature = "with-chrono")]
1074-
Value::ChronoTime(None) => write!(s, "NULL").unwrap(),
1075-
#[cfg(feature = "with-chrono")]
1076-
Value::ChronoDateTime(None) => write!(s, "NULL").unwrap(),
1077-
#[cfg(feature = "with-chrono")]
1078-
Value::ChronoDateTimeUtc(None) => write!(s, "NULL").unwrap(),
1079-
#[cfg(feature = "with-chrono")]
1080-
Value::ChronoDateTimeLocal(None) => write!(s, "NULL").unwrap(),
1081-
#[cfg(feature = "with-chrono")]
1082-
Value::ChronoDateTimeWithTimeZone(None) => write!(s, "NULL").unwrap(),
1083-
#[cfg(feature = "with-time")]
1084-
Value::TimeDate(None) => write!(s, "NULL").unwrap(),
1085-
#[cfg(feature = "with-time")]
1086-
Value::TimeTime(None) => write!(s, "NULL").unwrap(),
1087-
#[cfg(feature = "with-time")]
1088-
Value::TimeDateTime(None) => write!(s, "NULL").unwrap(),
1089-
#[cfg(feature = "with-time")]
1090-
Value::TimeDateTimeWithTimeZone(None) => write!(s, "NULL").unwrap(),
1091-
#[cfg(feature = "with-rust_decimal")]
1092-
Value::Decimal(None) => write!(s, "NULL").unwrap(),
1093-
#[cfg(feature = "with-bigdecimal")]
1094-
Value::BigDecimal(None) => write!(s, "NULL").unwrap(),
1095-
#[cfg(feature = "with-uuid")]
1096-
Value::Uuid(None) => write!(s, "NULL").unwrap(),
1097-
#[cfg(feature = "with-ipnetwork")]
1098-
Value::IpNetwork(None) => write!(s, "NULL").unwrap(),
1099-
#[cfg(feature = "with-mac_address")]
1100-
Value::MacAddress(None) => write!(s, "NULL").unwrap(),
1101-
#[cfg(feature = "postgres-array")]
1102-
Value::Array(None) => write!(s, "NULL").unwrap(),
1103-
Value::Bool(Some(b)) => write!(s, "{}", if *b { "TRUE" } else { "FALSE" }).unwrap(),
1104-
Value::TinyInt(Some(v)) => write!(s, "{}", v).unwrap(),
1105-
Value::SmallInt(Some(v)) => write!(s, "{}", v).unwrap(),
1106-
Value::Int(Some(v)) => write!(s, "{}", v).unwrap(),
1107-
Value::BigInt(Some(v)) => write!(s, "{}", v).unwrap(),
1108-
Value::TinyUnsigned(Some(v)) => write!(s, "{}", v).unwrap(),
1109-
Value::SmallUnsigned(Some(v)) => write!(s, "{}", v).unwrap(),
1110-
Value::Unsigned(Some(v)) => write!(s, "{}", v).unwrap(),
1111-
Value::BigUnsigned(Some(v)) => write!(s, "{}", v).unwrap(),
1112-
Value::Float(Some(v)) => write!(s, "{}", v).unwrap(),
1113-
Value::Double(Some(v)) => write!(s, "{}", v).unwrap(),
1114-
Value::String(Some(v)) => self.write_string_quoted(v, &mut s),
1115-
Value::Char(Some(v)) => {
1116-
self.write_string_quoted(std::str::from_utf8(&[*v as u8]).unwrap(), &mut s)
1117-
}
1118-
Value::Bytes(Some(v)) => write!(
1119-
s,
1120-
"x'{}'",
1121-
v.iter().map(|b| format!("{:02X}", b)).collect::<String>()
1122-
)
1123-
.unwrap(),
1124-
#[cfg(feature = "with-json")]
1125-
Value::Json(Some(v)) => self.write_string_quoted(&v.to_string(), &mut s),
1126-
#[cfg(feature = "with-chrono")]
1127-
Value::ChronoDate(Some(v)) => write!(s, "'{}'", v.format("%Y-%m-%d")).unwrap(),
1128-
#[cfg(feature = "with-chrono")]
1129-
Value::ChronoTime(Some(v)) => write!(s, "'{}'", v.format("%H:%M:%S")).unwrap(),
1130-
#[cfg(feature = "with-chrono")]
1131-
Value::ChronoDateTime(Some(v)) => {
1132-
write!(s, "'{}'", v.format("%Y-%m-%d %H:%M:%S")).unwrap()
1133-
}
1134-
#[cfg(feature = "with-chrono")]
1135-
Value::ChronoDateTimeUtc(Some(v)) => {
1136-
write!(s, "'{}'", v.format("%Y-%m-%d %H:%M:%S %:z")).unwrap()
1137-
}
1138-
#[cfg(feature = "with-chrono")]
1139-
Value::ChronoDateTimeLocal(Some(v)) => {
1140-
write!(s, "'{}'", v.format("%Y-%m-%d %H:%M:%S %:z")).unwrap()
1141-
}
1142-
#[cfg(feature = "with-chrono")]
1143-
Value::ChronoDateTimeWithTimeZone(Some(v)) => {
1144-
write!(s, "'{}'", v.format("%Y-%m-%d %H:%M:%S %:z")).unwrap()
1145-
}
1146-
#[cfg(feature = "with-time")]
1147-
Value::TimeDate(Some(v)) => {
1148-
write!(s, "'{}'", v.format(time_format::FORMAT_DATE).unwrap()).unwrap()
1149-
}
1150-
#[cfg(feature = "with-time")]
1151-
Value::TimeTime(Some(v)) => {
1152-
write!(s, "'{}'", v.format(time_format::FORMAT_TIME).unwrap()).unwrap()
1153-
}
1154-
#[cfg(feature = "with-time")]
1155-
Value::TimeDateTime(Some(v)) => {
1156-
write!(s, "'{}'", v.format(time_format::FORMAT_DATETIME).unwrap()).unwrap()
1157-
}
1158-
#[cfg(feature = "with-time")]
1159-
Value::TimeDateTimeWithTimeZone(Some(v)) => write!(
1160-
s,
1161-
"'{}'",
1162-
v.format(time_format::FORMAT_DATETIME_TZ).unwrap()
1163-
)
1164-
.unwrap(),
1165-
#[cfg(feature = "with-rust_decimal")]
1166-
Value::Decimal(Some(v)) => write!(s, "{}", v).unwrap(),
1167-
#[cfg(feature = "with-bigdecimal")]
1168-
Value::BigDecimal(Some(v)) => write!(s, "{}", v).unwrap(),
1169-
#[cfg(feature = "with-uuid")]
1170-
Value::Uuid(Some(v)) => write!(s, "'{}'", v).unwrap(),
1171-
#[cfg(feature = "postgres-array")]
1172-
Value::Array(Some(v)) => write!(
1173-
s,
1174-
"'{{{}}}'",
1175-
v.iter()
1176-
.map(|element| self.value_to_string(element))
1177-
.collect::<Vec<String>>()
1178-
.join(",")
1179-
)
1180-
.unwrap(),
1181-
#[cfg(feature = "with-ipnetwork")]
1182-
Value::IpNetwork(Some(v)) => write!(s, "'{}'", v).unwrap(),
1183-
#[cfg(feature = "with-mac_address")]
1184-
Value::MacAddress(Some(v)) => write!(s, "'{}'", v).unwrap(),
1185-
};
1186-
s
1187-
}
1188-
11891049
#[doc(hidden)]
11901050
/// Write ON CONFLICT expression
11911051
fn prepare_on_conflict(
@@ -1414,12 +1274,12 @@ pub trait QueryBuilder: QuotedBuilder + EscapeBuilder + TableRefBuilder {
14141274
match *frame {
14151275
Frame::UnboundedPreceding => write!(sql, " UNBOUNDED PRECEDING ").unwrap(),
14161276
Frame::Preceding(v) => {
1417-
self.prepare_value(&Some(v).into(), sql, collector);
1277+
self.prepare_value(&v.into(), sql, collector);
14181278
write!(sql, " PRECEDING ").unwrap();
14191279
}
14201280
Frame::CurrentRow => write!(sql, " CURRENT ROW ").unwrap(),
14211281
Frame::Following(v) => {
1422-
self.prepare_value(&Some(v).into(), sql, collector);
1282+
self.prepare_value(&v.into(), sql, collector);
14231283
write!(sql, " FOLLOWING ").unwrap();
14241284
}
14251285
Frame::UnboundedFollowing => write!(sql, " UNBOUNDED FOLLOWING ").unwrap(),

src/backend/sqlite/table.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ impl TableBuilder for SqliteQueryBuilder {
125125
match column_spec {
126126
ColumnSpec::Null => write!(sql, "NULL"),
127127
ColumnSpec::NotNull => write!(sql, "NOT NULL"),
128-
ColumnSpec::Default(value) => write!(sql, "DEFAULT {}", self.value_to_string(value)),
128+
ColumnSpec::Default(value) => write!(sql, "DEFAULT {}", value.to_sql_string()),
129129
ColumnSpec::AutoIncrement => write!(sql, "AUTOINCREMENT"),
130130
ColumnSpec::UniqueKey => write!(sql, "UNIQUE"),
131131
ColumnSpec::PrimaryKey => write!(sql, "PRIMARY KEY"),

src/expr.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,14 +1159,14 @@ impl Expr {
11591159
}
11601160

11611161
fn like_like(self, op: BinOper, like: LikeExpr) -> SimpleExpr {
1162-
let value = SimpleExpr::Value(Value::String(Some(Box::new(like.pattern))));
1162+
let value = SimpleExpr::Value(like.pattern.into());
11631163
self.bin_oper(
11641164
op,
11651165
match like.escape {
11661166
Some(escape) => SimpleExpr::Binary(
11671167
Box::new(value),
11681168
BinOper::Escape,
1169-
Box::new(SimpleExpr::Constant(Value::Char(Some(escape)))),
1169+
Box::new(SimpleExpr::Constant(escape.into())),
11701170
),
11711171
None => value,
11721172
},

src/lib.rs

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -746,6 +746,30 @@
746746
html_logo_url = "https://raw.githubusercontent.com/SeaQL/sea-query/master/docs/SeaQL icon dark.png"
747747
)]
748748

749+
pub use backend::*;
750+
pub use driver::*;
751+
// pub use error::*;
752+
pub use expr::*;
753+
//pub use extension::*;
754+
pub use foreign_key::*;
755+
pub use func::*;
756+
pub use index::*;
757+
pub use prepare::*;
758+
pub use query::*;
759+
pub use schema::*;
760+
#[cfg(feature = "attr")]
761+
pub use sea_query_attr::enum_def;
762+
#[cfg(feature = "derive")]
763+
pub use sea_query_derive::Iden;
764+
#[cfg(feature = "sea-query-driver")]
765+
pub use sea_query_driver::*;
766+
pub use table::*;
767+
//pub use shim::*;
768+
//pub use tests_cfg::*;
769+
pub use token::*;
770+
pub use types::*;
771+
pub use value::*;
772+
749773
pub mod backend;
750774
pub mod driver;
751775
pub mod error;
@@ -763,30 +787,3 @@ pub mod tests_cfg;
763787
pub mod token;
764788
pub mod types;
765789
pub mod value;
766-
767-
pub use backend::*;
768-
pub use driver::*;
769-
//pub use extension::*;
770-
pub use foreign_key::*;
771-
pub use index::*;
772-
pub use query::*;
773-
pub use table::*;
774-
// pub use error::*;
775-
pub use expr::*;
776-
pub use func::*;
777-
pub use prepare::*;
778-
pub use schema::*;
779-
//pub use shim::*;
780-
//pub use tests_cfg::*;
781-
pub use token::*;
782-
pub use types::*;
783-
pub use value::*;
784-
785-
#[cfg(feature = "derive")]
786-
pub use sea_query_derive::Iden;
787-
788-
#[cfg(feature = "attr")]
789-
pub use sea_query_attr::enum_def;
790-
791-
#[cfg(feature = "sea-query-driver")]
792-
pub use sea_query_driver::*;

src/prepare.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Helper for preparing SQL statements.
22
3-
use crate::*;
4-
pub use std::fmt::Write;
3+
use crate::{QueryBuilder, Token, Tokenizer, Value};
4+
pub use std::fmt::{self, Write};
55

66
#[derive(Debug, Default)]
77
pub struct SqlWriter {
@@ -24,7 +24,7 @@ where
2424
match token {
2525
Token::Punctuation(mark) => {
2626
if (mark.as_ref(), false) == query_builder.placeholder() {
27-
output.push(query_builder.value_to_string(&params[counter]));
27+
output.push(params[counter].to_sql_string());
2828
counter += 1;
2929
i += 1;
3030
continue;
@@ -33,7 +33,7 @@ where
3333
{
3434
if let Token::Unquoted(next) = &tokens[i + 1] {
3535
if let Ok(num) = next.parse::<usize>() {
36-
output.push(query_builder.value_to_string(&params[num - 1]));
36+
output.push(params[num - 1].to_sql_string());
3737
i += 2;
3838
continue;
3939
}
@@ -79,8 +79,8 @@ impl SqlWriter {
7979
}
8080
}
8181

82-
impl std::fmt::Write for SqlWriter {
83-
fn write_str(&mut self, s: &str) -> std::result::Result<(), std::fmt::Error> {
82+
impl Write for SqlWriter {
83+
fn write_str(&mut self, s: &str) -> fmt::Result {
8484
write!(
8585
self.string,
8686
"{}",
@@ -96,7 +96,7 @@ impl std::fmt::Write for SqlWriter {
9696
#[cfg(test)]
9797
#[cfg(feature = "backend-mysql")]
9898
mod tests {
99-
use super::*;
99+
use crate::*;
100100

101101
#[test]
102102
fn inject_parameters_1() {

src/query/delete.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ impl DeleteStatement {
9797

9898
/// Limit number of updated rows.
9999
pub fn limit(&mut self, limit: u64) -> &mut Self {
100-
self.limit = Some(Value::BigUnsigned(Some(limit)));
100+
self.limit = Some(limit.into());
101101
self
102102
}
103103

src/query/select.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1907,7 +1907,7 @@ impl SelectStatement {
19071907
/// );
19081908
/// ```
19091909
pub fn limit(&mut self, limit: u64) -> &mut Self {
1910-
self.limit = Some(Value::BigUnsigned(Some(limit)));
1910+
self.limit = Some(limit.into());
19111911
self
19121912
}
19131913

@@ -1945,7 +1945,7 @@ impl SelectStatement {
19451945
/// );
19461946
/// ```
19471947
pub fn offset(&mut self, offset: u64) -> &mut Self {
1948-
self.offset = Some(Value::BigUnsigned(Some(offset)));
1948+
self.offset = Some(offset.into());
19491949
self
19501950
}
19511951

0 commit comments

Comments
 (0)