Comments (4)
This is described as a feature of SQLite. I'm not really a fan either, but I don't think there's anything we can do on the Rust side since that's just how SQLite works. That FAQ is talking about insertion, but it makes the problem clear for FromSql
too - if you can store strings into a column you claimed was an Integer
, you can also get strings out of a column that claims to be an Integer
.
The relevant section of the C API is documented at https://www.sqlite.org/c3ref/column_blob.html. We could, in theory, call sqlite3_column_type
and check the declared storage type against the FromSql
implementor type, but this has at least 3 problems:
- We'd be blocking the (admittedly sketchy in Rust, probably) use case documented in the FAQ above.
- We'd be blocking the automatic conversions SQLite can do (e.g., if you store "1234" in a string column and ask for the value as an int, you'll get
1234
as an int). - Columns might be declared with no type information at all; this is perfectly legal in SQLite:
create table foo(x);
insert into foo(x) values(1234);
insert into foo(x) values('hello');
We could expose sqlite3_column_type
in the Rust API, though, and then you could use that to do checks if you wanted. Would that be sufficient for what you're trying to do?
from rusqlite.
What if you provided both the unsafe API (as currently implemented) and a safe API that fails in those three cases you mentioned? Then people who want the extra features can use the unsafe API (probably fine to leave this as get
), and people who want the type checks can opt into it (name would be get_safe
or something similar).
from rusqlite.
Yeah, that seems reasonable. What would you think about an API like this:
- Add a new method to
FromSql
which allows implementors to report whether the column is a valid type for themselves. Default to true, which is the current behavior.
pub trait FromSql {
unsafe fn column_result(stmt: *mut sqlite3_stmt, col: c_int) -> SqliteResult<Self>;
// implementors can override this and use sqlite3_column_type to reject conversion
// when using get_checked
unsafe fn is_valid_column_type(stmt: *mut sqlite3_stmt, col: c_int) -> bool {
true
}
}
- Add
get_checked
toSqliteRow
, returning aResult
that would beErr
ifis_valid_column_type
returns false.
from rusqlite.
Sure, sounds good.
from rusqlite.
Related Issues (20)
- libsqlite3-sys fails to build on arm64: error[E0308]: mismatched types HOT 2
- release the latest version HOT 4
- FromSql vs TryFrom / ToSql vs TryInto HOT 1
- `sqlite3_compileoption_used` and Rust `const fn`
- called `Result::unwrap()` on an `Err` value: SqliteFailure(Error { code: Unknown, extended_code: 1 }, Some("json_object() requires an even number of arguments")) HOT 2
- Apps using `winsqlite3` feature no longer builds HOT 5
- Question: Is there any way to use SQLite 3.45 with rusqlite 0.30.0? HOT 2
- Trait for abstracting over `Connection`/`Transaction`? HOT 3
- SqlInputError { error: Error { code: Unknown, extended_code: 1 }, msg: "unrecognized token: \"{\"" HOT 1
- Release 0.31.0 with SQLite 3.45? HOT 2
- Type issue on select with digits only in a "string" colums. HOT 2
- wasm32-wasi target fails on Apple M3
- How to get "returning *" from insert HOT 2
- Stale Connection Handler on Multi-Threaded Situation HOT 1
- sqlite3_snapshot iteration HOT 2
- Creating `Value::Blob` without necessarily allocating heap HOT 5
- Using rusqlite::vtab::VTabConnection::handle() HOT 4
- Add bindings for `sqlite3_trace_v2` API HOT 4
- iOS Linker Warning: SQLite was build for newer version than being linked HOT 2
- the first query is failure due to below error HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from rusqlite.