diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1189e2d2bc..3e3addaecd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## 0.5.5 - 2021-05-24
+
+- [[#1242]] Fix infinite loop at compile time when using query macros [[@toshokan]]
+
+[#1242]: https://github.com/launchbadge/sqlx/pull/1242
+
+## 0.5.4 - 2021-05-22
+
+- [[#1235]] Fix compilation with rustls from an eager update to webpki [[@ETCaton]]
+
+[#1235]: https://github.com/launchbadge/sqlx/pull/1235
+
## 0.5.3 - 2021-05-21
- [[#1211]] Even more tweaks and fixes to the Pool internals [[@abonander]]
@@ -911,3 +923,5 @@ Fix docs.rs build by enabling a runtime feature in the docs.rs metadata in `Carg
[@guylapid]: https://github.com/guylapid
[@natproach]: https://github.com/NatPRoach
[@feikesteenbergen]: https://github.com/feikesteenbergen
+[@etcaton]: https://github.com/ETCaton
+[@toshokan]: https://github.com/toshokan
diff --git a/Cargo.lock b/Cargo.lock
index 82aa0caeed..bab48c5036 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2255,7 +2255,7 @@ dependencies = [
[[package]]
name = "sqlx"
-version = "0.5.3"
+version = "0.5.5"
dependencies = [
"anyhow",
"async-std",
@@ -2288,7 +2288,7 @@ dependencies = [
[[package]]
name = "sqlx-cli"
-version = "0.5.3"
+version = "0.5.5"
dependencies = [
"anyhow",
"async-trait",
@@ -2310,7 +2310,7 @@ dependencies = [
[[package]]
name = "sqlx-core"
-version = "0.5.3"
+version = "0.5.5"
dependencies = [
"ahash",
"atoi",
@@ -2435,7 +2435,7 @@ dependencies = [
[[package]]
name = "sqlx-macros"
-version = "0.5.3"
+version = "0.5.5"
dependencies = [
"dotenv",
"either",
@@ -2456,7 +2456,7 @@ dependencies = [
[[package]]
name = "sqlx-rt"
-version = "0.5.3"
+version = "0.5.5"
dependencies = [
"actix-rt",
"async-native-tls",
diff --git a/Cargo.toml b/Cargo.toml
index 6234ea8d49..2861b2024e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -17,7 +17,7 @@ members = [
[package]
name = "sqlx"
-version = "0.5.3"
+version = "0.5.5"
license = "MIT OR Apache-2.0"
readme = "README.md"
repository = "https://github.com/launchbadge/sqlx"
@@ -129,8 +129,8 @@ bstr = ["sqlx-core/bstr"]
git2 = ["sqlx-core/git2"]
[dependencies]
-sqlx-core = { version = "0.5.3", path = "sqlx-core", default-features = false }
-sqlx-macros = { version = "0.5.3", path = "sqlx-macros", default-features = false, optional = true }
+sqlx-core = { version = "0.5.5", path = "sqlx-core", default-features = false }
+sqlx-macros = { version = "0.5.5", path = "sqlx-macros", default-features = false, optional = true }
[dev-dependencies]
anyhow = "1.0.31"
diff --git a/README.md b/README.md
index df8a0e056d..7b14e4574b 100644
--- a/README.md
+++ b/README.md
@@ -50,7 +50,7 @@
@@ -59,20 +59,23 @@ SQLx is an async, pure Rust† SQL crate featuring compile-time check
- **Truly Asynchronous**. Built from the ground-up using async/await for maximum concurrency.
-- **Type-safe SQL** (if you want it) without DSLs. Use the `query!()` macro to check your SQL and bind parameters at
- compile time. (You can still use dynamic SQL queries if you like.)
+- **Compile-time checked queries** (if you want). See [SQLx is not an ORM](#sqlx-is-not-an-orm).
- **Database Agnostic**. Support for [PostgreSQL], [MySQL], [SQLite], and [MSSQL].
- **Pure Rust**. The Postgres and MySQL/MariaDB drivers are written in pure Rust using **zero** unsafe†† code.
-* **Runtime Agnostic**. Works on different runtimes ([async-std](https://crates.io/crates/async-std) / [tokio](https://crates.io/crates/tokio) / [actix](https://crates.io/crates/actix-rt)) and TLS backends ([native-tls](https://crates.io/crates/native-tls), [rustls](https://crates.io/crates/rustls)).
+- **Runtime Agnostic**. Works on different runtimes ([`async-std`] / [`tokio`] / [`actix`]) and TLS backends ([`native-tls`], [`rustls`]).
-† The SQLite driver uses the libsqlite3 C library as SQLite is an embedded database (the only way
-we could be pure Rust for SQLite is by porting _all_ of SQLite to Rust).
+
-†† SQLx uses `#![forbid(unsafe_code)]` unless the `sqlite` feature is enabled. As the SQLite driver interacts
-with C, those interactions are `unsafe`.
+† The SQLite driver uses the libsqlite3 C library as SQLite is an embedded database (the only way
+we could be pure Rust for SQLite is by porting _all_ of SQLite to Rust).
+
+†† SQLx uses `#![forbid(unsafe_code)]` unless the `sqlite` feature is enabled. As the SQLite driver interacts
+with C, those interactions are `unsafe`.
+
+
[postgresql]: http://postgresql.org/
[sqlite]: https://sqlite.org/
@@ -108,6 +111,8 @@ SQLx is compatible with the [`async-std`], [`tokio`] and [`actix`] runtimes; and
[`async-std`]: https://github.com/async-rs/async-std
[`tokio`]: https://github.com/tokio-rs/tokio
[`actix`]: https://github.com/actix/actix-net
+[`native-tls`]: https://crates.io/crates/native-tls
+[`rustls`]: https://crates.io/crates/rustls
```toml
# Cargo.toml
@@ -118,7 +123,7 @@ sqlx = { version = "0.5", features = [ "runtime-tokio-rustls" ] }
sqlx = { version = "0.5", features = [ "runtime-async-std-native-tls" ] }
```
-The runtime and TLS backend not being separate feature sets to select is a workaround for a [Cargo issue](https://github.com/rust-lang/cargo/issues/3494).
+The runtime and TLS backend not being separate feature sets to select is a workaround for a [Cargo issue](https://github.com/rust-lang/cargo/issues/3494).
#### Cargo Feature Flags
@@ -168,6 +173,24 @@ sqlx = { version = "0.5", features = [ "runtime-async-std-native-tls" ] }
- `tls`: Add support for TLS connections.
+## SQLx is not an ORM!
+
+SQLx supports **compile-time checked queries**. It does not, however, do this by providing a Rust
+API or DSL (domain-specific language) for building queries. Instead, it provides macros that take
+regular SQL as an input and ensure that it is valid for your database. The way this works is that
+SQLx connects to your development DB at compile time to have the database itself verify (and return
+some info on) your SQL queries. This has some potentially surprising implications:
+
+- Since SQLx never has to parse the SQL string itself, any syntax that the development DB accepts
+ can be used (including things added by database extensions)
+- Due to the different amount of information databases let you retrieve about queries, the extent of
+ SQL verification you get from the query macros depends on the database
+
+**If you are looking for an (asynchronous) ORM,** you can check out [`ormx`], which is built on top
+of SQLx.
+
+[`ormx`]: https://crates.io/crates/ormx
+
## Usage
### Quickstart
@@ -336,8 +359,8 @@ Differences from `query()`:
```
The biggest downside to `query!()` is that the output type cannot be named (due to Rust not
-officially supporting anonymous records). To address that, there is a `query_as!()` macro that is identical
-except that you can name the output type.
+officially supporting anonymous records). To address that, there is a `query_as!()` macro that is
+mostly identical except that you can name the output type.
```rust
// no traits are needed
@@ -359,6 +382,11 @@ WHERE organization = ?
// countries[0].count
```
+To avoid the need of having a development database around to compile the project even when no
+modifications (to the database-accessing parts of the code) are done, you can enable "offline mode"
+to cache the results of the SQL query analysis using the `sqlx` command-line tool. See
+[sqlx-cli/README.md](./sqlx-cli/README.md#enable-building-in-offline-mode-with-query).
+
## Safety
This crate uses `#![forbid(unsafe_code)]` to ensure everything is implemented in 100% Safe Rust.
diff --git a/sqlx-cli/Cargo.toml b/sqlx-cli/Cargo.toml
index 6b9f1549fd..0c0d92a0bb 100644
--- a/sqlx-cli/Cargo.toml
+++ b/sqlx-cli/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "sqlx-cli"
-version = "0.5.3"
+version = "0.5.5"
description = "Command-line utility for SQLx, the Rust SQL toolkit."
edition = "2018"
readme = "README.md"
@@ -27,7 +27,7 @@ path = "src/bin/cargo-sqlx.rs"
[dependencies]
dotenv = "0.15"
tokio = { version = "1.0.1", features = ["macros", "rt", "rt-multi-thread"] }
-sqlx = { version = "0.5.3", path = "..", default-features = false, features = [
+sqlx = { version = "0.5.5", path = "..", default-features = false, features = [
"runtime-async-std-native-tls",
"migrate",
"any",
diff --git a/sqlx-cli/README.md b/sqlx-cli/README.md
index 0c47941c4e..f098dad8ab 100644
--- a/sqlx-cli/README.md
+++ b/sqlx-cli/README.md
@@ -49,17 +49,19 @@ $ sqlx migrate run
Compares the migration history of the running database against the `migrations/` folder and runs
any scripts that are still pending.
-#### Enable building in "offline" mode with `query!()`
+#### Enable building in "offline mode" with `query!()`
Note: must be run as `cargo sqlx`.
```bash
cargo sqlx prepare
```
-Saves query data to `sqlx-data.json` in the current directory; check this file into version control
-and an active database connection will no longer be needed to build your project.
-Has no effect unless the `offline` feature of `sqlx` is enabled in your project. Omitting that feature is the most likely cause if you get a `sqlx-data.json` file that looks like this:
+Saves query metadata to `sqlx-data.json` in the current directory; check this file into version
+control and an active database connection will no longer be needed to build your project.
+
+Has no effect unless the `offline` feature of `sqlx` is enabled in your project. Omitting that
+feature is the most likely cause if you get a `sqlx-data.json` file that looks like this:
```json
{
@@ -67,10 +69,12 @@ Has no effect unless the `offline` feature of `sqlx` is enabled in your project.
}
```
-----
+---
+
```bash
cargo sqlx prepare --check
```
+
Exits with a nonzero exit status if the data in `sqlx-data.json` is out of date with the current
database schema and queries in the project. Intended for use in Continuous Integration.
@@ -79,3 +83,6 @@ database schema and queries in the project. Intended for use in Continuous Integ
To make sure an accidentally-present `DATABASE_URL` environment variable or `.env` file does not
result in `cargo build` (trying to) access the database, you can set the `SQLX_OFFLINE` environment
variable to `true`.
+
+If you want to make this the default, just add it to your `.env` file. `cargo sqlx prepare` will
+still do the right thing and connect to the database.
diff --git a/sqlx-core/Cargo.toml b/sqlx-core/Cargo.toml
index 7d4ade7798..bfa3f5f9ae 100644
--- a/sqlx-core/Cargo.toml
+++ b/sqlx-core/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "sqlx-core"
-version = "0.5.3"
+version = "0.5.5"
repository = "https://github.com/launchbadge/sqlx"
description = "Core of SQLx, the rust SQL toolkit. Not intended to be used directly."
license = "MIT OR Apache-2.0"
@@ -100,7 +100,7 @@ offline = ["serde", "either/serde"]
[dependencies]
ahash = "0.7.2"
atoi = "0.4.0"
-sqlx-rt = { path = "../sqlx-rt", version = "0.5.3" }
+sqlx-rt = { path = "../sqlx-rt", version = "0.5.5" }
base64 = { version = "0.13.0", default-features = false, optional = true, features = ["std"] }
bigdecimal_ = { version = "0.2.0", optional = true, package = "bigdecimal" }
rust_decimal = { version = "1.8.1", optional = true }
diff --git a/sqlx-macros/Cargo.toml b/sqlx-macros/Cargo.toml
index 91ae1f6071..b76185ed53 100644
--- a/sqlx-macros/Cargo.toml
+++ b/sqlx-macros/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "sqlx-macros"
-version = "0.5.3"
+version = "0.5.5"
repository = "https://github.com/launchbadge/sqlx"
description = "Macros for SQLx, the rust SQL toolkit. Not intended to be used directly."
license = "MIT OR Apache-2.0"
@@ -84,8 +84,8 @@ heck = "0.3.1"
either = "1.5.3"
once_cell = "1.5.2"
proc-macro2 = { version = "1.0.9", default-features = false }
-sqlx-core = { version = "0.5.3", default-features = false, path = "../sqlx-core" }
-sqlx-rt = { version = "0.5.3", default-features = false, path = "../sqlx-rt" }
+sqlx-core = { version = "0.5.5", default-features = false, path = "../sqlx-core" }
+sqlx-rt = { version = "0.5.5", default-features = false, path = "../sqlx-rt" }
serde = { version = "1.0.111", features = ["derive"], optional = true }
serde_json = { version = "1.0.30", features = ["preserve_order"], optional = true }
sha2 = { version = "0.9.1", optional = true }
diff --git a/sqlx-macros/src/query/args.rs b/sqlx-macros/src/query/args.rs
index b46b7f664e..71094a67d2 100644
--- a/sqlx-macros/src/query/args.rs
+++ b/sqlx-macros/src/query/args.rs
@@ -79,13 +79,13 @@ pub fn quote_args(
use ::sqlx::ty_match::{WrapSameExt as _, MatchBorrowExt as _};
// evaluate the expression only once in case it contains moves
- let _expr = ::sqlx::ty_match::dupe_value(#name);
+ let expr = ::sqlx::ty_match::dupe_value(#name);
- // if `_expr` is `Option`, get `Option<$ty>`, otherwise `$ty`
- let ty_check = ::sqlx::ty_match::WrapSame::<#param_ty, _>::new(&_expr).wrap_same();
+ // if `expr` is `Option`, get `Option<$ty>`, otherwise `$ty`
+ let ty_check = ::sqlx::ty_match::WrapSame::<#param_ty, _>::new(&expr).wrap_same();
- // if `_expr` is `&str`, convert `String` to `&str`
- let (mut _ty_check, match_borrow) = ::sqlx::ty_match::MatchBorrow::new(ty_check, &_expr);
+ // if `expr` is `&str`, convert `String` to `&str`
+ let (mut _ty_check, match_borrow) = ::sqlx::ty_match::MatchBorrow::new(ty_check, &expr);
_ty_check = match_borrow.match_borrow();
diff --git a/sqlx-macros/src/query/mod.rs b/sqlx-macros/src/query/mod.rs
index d114f54528..91c706dc42 100644
--- a/sqlx-macros/src/query/mod.rs
+++ b/sqlx-macros/src/query/mod.rs
@@ -37,7 +37,7 @@ struct Metadata {
static METADATA: Lazy = Lazy::new(|| {
use std::env;
- let manifest_dir = env::var("CARGO_MANIFEST_DIR")
+ let manifest_dir: PathBuf = env::var("CARGO_MANIFEST_DIR")
.expect("`CARGO_MANIFEST_DIR` must be set")
.into();
@@ -47,7 +47,7 @@ static METADATA: Lazy = Lazy::new(|| {
// If a .env file exists at CARGO_MANIFEST_DIR, load environment variables from this,
// otherwise fallback to default dotenv behaviour.
- let env_path = METADATA.manifest_dir.join(".env");
+ let env_path = manifest_dir.join(".env");
if env_path.exists() {
let res = dotenv::from_path(&env_path);
if let Err(e) = res {
@@ -303,7 +303,8 @@ where
for rust_col in &columns {
if rust_col.type_.is_wildcard() {
return Err(
- "columns may not have wildcard overrides in `query!()` or `query_as!()"
+ "wildcard overrides are only allowed with an explicit record type, \
+ e.g. `query_as!()` and its variants"
.into(),
);
}
diff --git a/sqlx-rt/Cargo.toml b/sqlx-rt/Cargo.toml
index 75fa4bc9c4..942a54753f 100644
--- a/sqlx-rt/Cargo.toml
+++ b/sqlx-rt/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "sqlx-rt"
-version = "0.5.3"
+version = "0.5.5"
repository = "https://github.com/launchbadge/sqlx"
license = "MIT OR Apache-2.0"
description = "Runtime abstraction used by SQLx, the Rust SQL toolkit. Not intended to be used directly."