Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ description = "Write SQL queries in a simple and composable way"
documentation = "https://docs.rs/sql_query_builder"
repository = "https://github.com/belchior/sql_query_builder"
authors = ["Belchior Oliveira <belchior@outlook.com>"]
version = "2.6.2"
version = "2.7.2"
edition = "2021"
rust-version = "1.62"
license = "MIT"
Expand Down
22 changes: 22 additions & 0 deletions src/concat/non_standard.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,28 @@ pub(crate) trait ConcatLimit<Clause: PartialEq> {
}
}

#[cfg(any(feature = "postgresql", feature = "sqlite", feature = "mysql"))]
pub(crate) trait ConcatOffset<Clause: PartialEq> {
fn concat_offset(
&self,
items_raw_before: &Vec<(Clause, String)>,
items_raw_after: &Vec<(Clause, String)>,
query: String,
fmts: &fmt::Formatter,
clause: Clause,
offset: &str,
) -> String {
let fmt::Formatter { lb, space, .. } = fmts;
let sql = if offset.is_empty() == false {
format!("OFFSET{space}{offset}{space}{lb}")
} else {
"".to_string()
};

concat_raw_before_after(items_raw_before, items_raw_after, query, fmts, clause, sql)
}
}

#[cfg(any(feature = "postgresql", feature = "sqlite"))]
pub(crate) trait ConcatReturning<Clause: PartialEq> {
fn concat_returning(
Expand Down
92 changes: 62 additions & 30 deletions src/delete/delete.rs
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,38 @@ impl Delete {
#[cfg_attr(docsrs, doc(cfg(feature = "sqlite")))]
#[cfg_attr(docsrs, doc(cfg(feature = "mysql")))]
impl Delete {
/// The `limit` clause, this method overrides the previous value
///
/// # Example
///
/// ```
/// # #[cfg(any(feature = "sqlite", feature = "mysql"))]
/// # {
/// # use sql_query_builder as sql;
/// let delete = sql::Delete::new()
/// .limit("123");
///
/// let delete = sql::Delete::new()
/// .limit("1000")
/// .limit("123");
///
/// # let expected = "LIMIT 123";
/// # assert_eq!(expected, delete.as_string());
/// # }
/// ```
///
/// Output
///
/// ```sql
/// LIMIT 123
/// ```
///
/// Note: For crate feature `sqlite` this clause is behind a flag at SQLite, [more info](https://sqlite.org/lang_delete.html#optional_limit_and_order_by_clauses).
pub fn limit(mut self, num: &str) -> Self {
self._limit = num.trim().to_string();
self
}

/// The `order by` clause.
///
/// # Example
Expand Down Expand Up @@ -401,6 +433,36 @@ impl Delete {
}
}

#[cfg(any(doc, feature = "sqlite"))]
#[cfg_attr(docsrs, doc(cfg(feature = "sqlite")))]
impl Delete {
/// The `offset` clause, this method overrides the previous value
///
/// # Example
///
/// ```
/// # #[cfg(feature = "sqlite")]
/// # {
/// # use sql_query_builder as sql;
/// let delete = sql::Delete::new()
/// .offset("1500");
///
/// let delete = sql::Delete::new()
/// .offset("1000")
/// .offset("1500");
///
/// # let expected = "OFFSET 1500";
/// # assert_eq!(expected, delete.as_string());
/// # }
/// ```
///
/// Note: For crate feature `sqlite` this clause is behind a flag at SQLite, [more info](https://sqlite.org/lang_delete.html#optional_limit_and_order_by_clauses).
pub fn offset(mut self, num: &str) -> Self {
self._offset = num.trim().to_string();
self
}
}

#[cfg(any(doc, feature = "mysql"))]
#[cfg_attr(docsrs, doc(cfg(feature = "mysql")))]
impl Delete {
Expand Down Expand Up @@ -644,36 +706,6 @@ impl Delete {
self
}

/// The `limit` clause, this method overrides the previous value
///
/// # Example
///
/// ```
/// # #[cfg(feature = "mysql")]
/// # {
/// # use sql_query_builder as sql;
/// let delete = sql::Delete::new()
/// .limit("123");
///
/// let delete = sql::Delete::new()
/// .limit("1000")
/// .limit("123");
///
/// # let expected = "LIMIT 123";
/// # assert_eq!(expected, delete.as_string());
/// # }
/// ```
///
/// Output
///
/// ```sql
/// LIMIT 123
/// ```
pub fn limit(mut self, num: &str) -> Self {
self._limit = num.trim().to_string();
self
}

/// The `partition` clause
///
/// # Example
Expand Down
28 changes: 24 additions & 4 deletions src/delete/delete_internal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,22 @@ impl Concat for Delete {
DeleteClause::OrderBy,
&self._order_by,
);
query = self.concat_limit(
&self._raw_before,
&self._raw_after,
query,
&fmts,
DeleteClause::Limit,
&self._limit,
);
query = self.concat_offset(
&self._raw_before,
&self._raw_after,
query,
&fmts,
DeleteClause::Offset,
&self._offset,
);
}

#[cfg(feature = "mysql")]
Expand Down Expand Up @@ -183,15 +199,21 @@ use crate::concat::non_standard::ConcatReturning;
impl ConcatReturning<DeleteClause> for Delete {}

#[cfg(any(feature = "sqlite", feature = "mysql"))]
use crate::concat::sql_standard::ConcatOrderBy;
use crate::concat::{non_standard::ConcatLimit, sql_standard::ConcatOrderBy};
#[cfg(any(feature = "sqlite", feature = "mysql"))]
impl ConcatLimit<DeleteClause> for Delete {}
#[cfg(any(feature = "sqlite", feature = "mysql"))]
impl ConcatOrderBy<DeleteClause> for Delete {}

#[cfg(feature = "sqlite")]
use crate::concat::non_standard::ConcatOffset;
#[cfg(feature = "sqlite")]
impl ConcatOffset<DeleteClause> for Delete {}

#[cfg(feature = "mysql")]
use crate::{
concat::{
mysql::ConcatPartition,
non_standard::ConcatLimit,
sql_standard::{ConcatFrom, ConcatJoin},
},
utils,
Expand All @@ -201,8 +223,6 @@ impl ConcatFrom<DeleteClause> for Delete {}
#[cfg(feature = "mysql")]
impl ConcatJoin<DeleteClause> for Delete {}
#[cfg(feature = "mysql")]
impl ConcatLimit<DeleteClause> for Delete {}
#[cfg(feature = "mysql")]
impl ConcatPartition<DeleteClause> for Delete {}

#[cfg(feature = "mysql")]
Expand Down
1 change: 0 additions & 1 deletion src/select/select.rs
Original file line number Diff line number Diff line change
Expand Up @@ -567,7 +567,6 @@ impl Select {

#[cfg(any(feature = "postgresql", feature = "sqlite", feature = "mysql"))]
use crate::behavior::WithQuery;

#[cfg(any(feature = "postgresql", feature = "sqlite", feature = "mysql"))]
impl WithQuery for Select {}

Expand Down
59 changes: 29 additions & 30 deletions src/select/select_internal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,14 @@ impl Concat for Select {
SelectClause::Limit,
&self._limit,
);
query = self.concat_offset(query, &fmts);
query = self.concat_offset(
&self._raw_before,
&self._raw_after,
query,
&fmts,
SelectClause::Offset,
&self._offset,
);
query = self.concat_combinator(query, &fmts, Combinator::Except);
query = self.concat_combinator(query, &fmts, Combinator::Intersect);
query = self.concat_combinator(query, &fmts, Combinator::Union);
Expand Down Expand Up @@ -179,7 +186,14 @@ impl Concat for Select {
SelectClause::Limit,
&self._limit,
);
query = self.concat_offset(query, &fmts);
query = self.concat_offset(
&self._raw_before,
&self._raw_after,
query,
&fmts,
SelectClause::Offset,
&self._offset,
);
query = self.concat_combinator(query, &fmts, Combinator::Except);
query = self.concat_combinator(query, &fmts, Combinator::Intersect);
query = self.concat_combinator(query, &fmts, Combinator::Union);
Expand Down Expand Up @@ -250,7 +264,14 @@ impl Concat for Select {
SelectClause::Limit,
&self._limit,
);
query = self.concat_offset(query, &fmts);
query = self.concat_offset(
&self._raw_before,
&self._raw_after,
query,
&fmts,
SelectClause::Offset,
&self._offset,
);
query = self.concat_combinator(query, &fmts, Combinator::Except);
query = self.concat_combinator(query, &fmts, Combinator::Intersect);
query = self.concat_combinator(query, &fmts, Combinator::Union);
Expand Down Expand Up @@ -339,12 +360,13 @@ impl Select {
}

#[cfg(any(feature = "postgresql", feature = "sqlite", feature = "mysql"))]
use crate::concat::non_standard::{ConcatLimit, ConcatWith};

#[cfg(any(feature = "postgresql", feature = "sqlite", feature = "mysql"))]
impl ConcatWith<SelectClause> for Select {}
use crate::concat::non_standard::{ConcatLimit, ConcatOffset, ConcatWith};
#[cfg(any(feature = "postgresql", feature = "sqlite", feature = "mysql"))]
impl ConcatLimit<SelectClause> for Select {}
#[cfg(any(feature = "postgresql", feature = "sqlite", feature = "mysql"))]
impl ConcatOffset<SelectClause> for Select {}
#[cfg(any(feature = "postgresql", feature = "sqlite", feature = "mysql"))]
impl ConcatWith<SelectClause> for Select {}

#[cfg(any(feature = "postgresql", feature = "sqlite", feature = "mysql"))]
impl Select {
Expand Down Expand Up @@ -395,30 +417,7 @@ impl Select {
}
}

#[cfg(any(feature = "postgresql", feature = "sqlite", feature = "mysql"))]
impl Select {
fn concat_offset(&self, query: String, fmts: &fmt::Formatter) -> String {
let fmt::Formatter { lb, space, .. } = fmts;
let sql = if self._offset.is_empty() == false {
let start = &self._offset;
format!("OFFSET{space}{start}{space}{lb}")
} else {
"".to_string()
};

concat_raw_before_after(
&self._raw_before,
&self._raw_after,
query,
fmts,
SelectClause::Offset,
sql,
)
}
}

#[cfg(feature = "mysql")]
use crate::concat::mysql::ConcatPartition;

#[cfg(feature = "mysql")]
impl ConcatPartition<SelectClause> for Select {}
Loading
Loading