Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix handling of deferred constraints #2913

Merged

Conversation

Thomasdezeeuw
Copy link
Contributor

Currently this for PostgreSQL only, but if the fix would be accepted I can apply it to the other databases as well.

Fixes #1370

@abonander
Copy link
Collaborator

I'll accept this but do note:

The MySQL driver would need some tweaking in order for there to not be a performance footgun by using .fetch_optional() without LIMIT 1. Right now it doesn't do anything to limit the size of the resultset, so .fetch_optional() would have to wait until the server is finished sending all of it to get the result. That's a large reason why the current implementation is how it is, to be consistent for all drivers.

It looks like it's possible to limit the number of rows returned by setting the flag to request a cursor and then calling COM_STMT_FETCH on that cursor, but it sounds like the cursor type depends on what kind of query you're executing? The MariaDB docs explain it a little better than the MySQL docs but only slightly: https://mariadb.com/kb/en/com_stmt_execute/#flag

vs: https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_com_stmt_execute.html

If I had to hazard a guess, I think requesting a "for update" cursor means you're allowed to send a data-modifying query while still having it open. It must make a copy of the dataset or something. Whereas a "read only" cursor would forbid a concurrent query and read data directly from the table. I think the latter is a safe choice as I don't think we'd ever want to allow that. It'd just be a massive footgun.

@abonander abonander merged commit 31e541a into launchbadge:main Jan 20, 2024
64 checks passed
@Thomasdezeeuw Thomasdezeeuw deleted the fix-deferred-constraint-handling branch January 20, 2024 12:18
kukabi pushed a commit to helikon-labs/sqlx that referenced this pull request Feb 22, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

PostgreSQL deferred FK constraint violations are silently dropped
2 participants