-
Notifications
You must be signed in to change notification settings - Fork 1.5k
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
Upsert error on MySQL: Query ... is required to return data, but found no record(s)
when you try to write an overflowing unsigned int
#15264
Upsert error on MySQL: Query ... is required to return data, but found no record(s)
when you try to write an overflowing unsigned int
#15264
Comments
Thanks for opening this separate issue. Few clarification questions |
Yes, it actually is being passed an empty object. No updates are needed in this case, if the record already exists. The intent is: retrieve the existing record, or create a new record if needed, either way, get back a record, and do it using an atomic db operation, to minimize the possibility of the new record being added elsewhere.
Correct. There's no need to do that, as the defaulting behavior is supposed to be taking care of that (when creating the record), and, I do not want to update it if the record already existed, as, it's supposed to be a record indicating when the record was created. Wouldn't be right to update it after creation. |
Hey @janpio , any update on this? |
No, this is waiting for a reproduction from us. |
Hey folks, Unfortunately, I can't seem to reproduce your issues locally. I suspect some concurrency issues to be happening here. |
When I read the error message Do you have parallel requests that could delete the data while it is being modified by the Any help is welcome to hopefully be able to reproduce this. |
Ok, I put some time into recreating this issue, and, I had, I would say, some success! I'm not sure this is the answer for all possible vectors for this error, however, what I have found is:
So, somewhere the integer to unsigned int conversion is not symmetrical, I would say, which leads to this issue. Realizing that this was happening, even if I add to the schema definition for the ID column eg: schema:
code: for (const create of [
{ email: 'betty@flintstone.com', id: 1041680182 },
{ email: 'betty@flintstone.com', id: 301604023 },
{ email: 'barney@flintstone.com', id: 1546252519 },
{ email: 'wilma@flintstone.com', id: 2173158296 },
{ email: 'wilma@flintstone.com', id: 2183158296 },
{ email: 'fred@flintstone.com', id: 4249317952 },
{ email: 'fred@flintstone.com', id: 692889259 },
]) {
console.log('id:', create.id);
const cacheEntry = await prisma.cacheEntry.upsert({
where: {
email: create.email
},
update: {},
create: create,
});
console.log('cacheEntry for ' + create.email, cacheEntry);
} output:
At this point, the db has 3 rows in the db. |
Hey @Peter-Sparksuite, Brilliant work on the repro! This made our job extremely easy to fix the issue. Turns out the issue was reproducible with a single upsert that contained an id that would overflow. The fix will be available in the next Prisma release (unsigned ints won't overflow anymore). Thanks again, cheers 🙏 |
Cool. Thank you! |
@Simonpedro Can you please have a look at the data connected to your requests if this could also be the underlying trigger here? If not, I might need to ask you (again) to create a new issue for your problem and try to supply as much data as possible. |
@janpio I spent some time digging into it.
Yes, it's likely that under certain conditions, we trigger an Regarding Peter's findings, I couldn't reproduce it either and don't think it's related, mainly because my I'll keep an eye on it. I just improved the catch branch of the screenshot I had shared by adding more debugging information. If I find any insights, I'll let you know via a new issue. Thanks a lot! |
* test(client): uint id overflow * Update packages/client/tests/functional/issues/15264-uint-id-overflow/tests.ts * Update packages/client/tests/functional/issues/15264-uint-id-overflow/tests.ts Co-authored-by: Daniel Starns <danielstarns@hotmail.com>
Hey, I might want to add something to this problem. If this is a separate issue, I can create a new one. Repository to reproduce: Schema for convenience:
Edit: I'm sorry, I just noticed that this issue was already closed. |
No worries, that does not mean we cannot reopen the issue. Is this only happening with |
Hey @Haschikeks, thanks for including a reproduction. This issue here was technically only about this error message when you try to write an overflowing unsigned int - the title just does not reflect that. Can you please open a new bug report issue, include your current comment text from here and also the additional information it is asking for? Thanks! We will take a look as soon as possible then. |
Query ... is required to return data, but found no record(s)
Query ... is required to return data, but found no record(s)
when you try to write an overflowing unsigned int
Bug description
I see the
Query ... is required to return data, but found no record(s)
error.Similar in manifestation to #12783, but, this time without having a Date involved in the primary or unique keys.
However, the entity does have two date fields.
I don't have approval to share full details regarding our schema at present, but, I can tell you, regarding the table where this is happening: the primary key is a single column being an unsigned integer, and the value that it's set to is always provided externally, not auto-generated by the DB.
There are two columns that are DateTime columns. One is entirely optional, the other is required, and defaults to 'now()' via the schema having
@default(now())
.The emailAddress column is required to be unique.
The error occurs with code that looks rather like this:
The intent being to either retrieve (with no changes) the existing record (being retrieved by the unique column, not the primary ID column), or, create a new record (hence, the 'update' has an empty object). Either way, an object is supposed to be returned.
I believe, in most cases, the db record will already have been created, so it
should be heading down the 'update' path.
I kinda wonder if, due to the DateTime issue (ie: data mangling causing exact matches to fail to find results), this is somehow also playing a part here, but, it could be something else entirely.
How to reproduce
Expected behavior
The expected behavior is that either the existing record is returned, or, the newly created record is returned.
Prisma information
Environment & setup
Prisma Version
The text was updated successfully, but these errors were encountered: