Skip to content

Improved Compatibility Around LAST_INSERT_ID#17369

Closed
systay wants to merge 26 commits intovitessio:mainfrom
planetscale:dml-last-insert-id
Closed

Improved Compatibility Around LAST_INSERT_ID#17369
systay wants to merge 26 commits intovitessio:mainfrom
planetscale:dml-last-insert-id

Conversation

@systay
Copy link
Copy Markdown
Collaborator

@systay systay commented Dec 11, 2024

Description

This PR improves last_insert_id(x) behavior to align more closely with MySQL in various scenarios.

Key changes

  1. New fetch_last_insert_id Field
    Introduced a boolean field, fetch_last_insert_id, in the ExecuteOptions proto.
    • When enabled, vttablet automatically runs a SELECT last_insert_id() query immediately after executing a query containing a last_insert_id(x) expression.
    • The planner automatically sets this flag upon detecting such expressions.
    • This is to work around a mysql bug.
  2. sqltypes.Result Updates
    • Added a new field, InsertIDChanged.
    • This field signals that the session state must be updated with the new InsertID, even if the value is 0
  3. Query Signature Enhancements:
    • Updated semantic checking to store relevant information in the query’s QuerySignature.
  4. Improved LIMIT Behavior:
    • Enhanced LIMIT to ensure all input rows are received when expecting last_insert_id values.
    • As a result, in some scenarios, data retrieval from tablets cannot be stopped until all results are fetched.

Known Shortcomings:

For queries such as:

SELECT last_insert_id(x) FROM tbl ORDER BY y;

If the results are fetched from multiple shards, the last_insert_id() session state may not match the value of the last row returned from the query.

  • This behavior differs from MySQL, which sets the last_insert_id based on the final row of the query.

Related Issue(s)

Fixes #17298

Checklist

  • "Backport to:" labels have been added if this change should be back-ported to release branches
  • If this change is to be back-ported to previous releases, a justification is included in the PR description
  • Tests were added or are not required
  • Did the new or modified tests pass consistently locally and on CI?
  • Documentation was added or is not required

@vitess-bot
Copy link
Copy Markdown
Contributor

vitess-bot bot commented Dec 11, 2024

Review Checklist

Hello reviewers! 👋 Please follow this checklist when reviewing this Pull Request.

General

  • Ensure that the Pull Request has a descriptive title.
  • Ensure there is a link to an issue (except for internal cleanup and flaky test fixes), new features should have an RFC that documents use cases and test cases.

Tests

  • Bug fixes should have at least one unit or end-to-end test, enhancement and new features should have a sufficient number of tests.

Documentation

  • Apply the release notes (needs details) label if users need to know about this change.
  • New features should be documented.
  • There should be some code comments as to why things are implemented the way they are.
  • There should be a comment at the top of each new or modified test to explain what the test does.

New flags

  • Is this flag really necessary?
  • Flag names must be clear and intuitive, use dashes (-), and have a clear help text.

If a workflow is added or modified:

  • Each item in Jobs should be named in order to mark it as required.
  • If the workflow needs to be marked as required, the maintainer team must be notified.

Backward compatibility

  • Protobuf changes should be wire-compatible.
  • Changes to _vt tables and RPCs need to be backward compatible.
  • RPC changes should be compatible with vitess-operator
  • If a flag is removed, then it should also be removed from vitess-operator and arewefastyet, if used there.
  • vtctl command output order should be stable and awk-able.

@vitess-bot vitess-bot bot added NeedsBackportReason If backport labels have been applied to a PR, a justification is required NeedsDescriptionUpdate The description is not clear or comprehensive enough, and needs work NeedsIssue A linked issue is missing for this Pull Request NeedsWebsiteDocsUpdate What it says labels Dec 11, 2024
@systay systay added Type: Bug Component: Query Serving and removed NeedsDescriptionUpdate The description is not clear or comprehensive enough, and needs work NeedsWebsiteDocsUpdate What it says NeedsIssue A linked issue is missing for this Pull Request NeedsBackportReason If backport labels have been applied to a PR, a justification is required labels Dec 11, 2024
@github-actions github-actions bot added this to the v22.0.0 milestone Dec 11, 2024
@systay systay changed the title proto: add fetch_last_insert_id to ExecuteOptions Bugfix: Handle last_insert_id(x) even when x is 0 Dec 11, 2024
@systay systay changed the title Bugfix: Handle last_insert_id(x) even when x is 0 Bugfix: In DMLs, handle last_insert_id(x) even when x is 0 Dec 11, 2024
@codecov
Copy link
Copy Markdown

codecov bot commented Dec 11, 2024

Codecov Report

Attention: Patch coverage is 69.76744% with 39 lines in your changes missing coverage. Please review.

Project coverage is 67.52%. Comparing base (45192d2) to head (0db81eb).
Report is 2 commits behind head on main.

Files with missing lines Patch % Lines
go/vt/vttablet/tabletserver/query_executor.go 29.16% 34 Missing ⚠️
go/vt/vtgate/engine/insert.go 50.00% 2 Missing ⚠️
go/vt/vtgate/engine/lock.go 0.00% 1 Missing ⚠️
go/vt/vtgate/engine/unlock.go 0.00% 1 Missing ⚠️
go/vt/vtgate/executorcontext/vcursor_impl.go 50.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #17369      +/-   ##
==========================================
- Coverage   67.52%   67.52%   -0.01%     
==========================================
  Files        1581     1581              
  Lines      253948   254025      +77     
==========================================
+ Hits       171480   171519      +39     
- Misses      82468    82506      +38     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@systay systay changed the title Bugfix: In DMLs, handle last_insert_id(x) even when x is 0 Bugfix: handle last_insert_id(x) even when x is 0 Dec 16, 2024
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
harshit-gangal and others added 4 commits December 17, 2024 15:58
… modified

Signed-off-by: Harshit Gangal <harshit@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
@systay systay changed the title Bugfix: handle last_insert_id(x) even when x is 0 Improved Compatibility Around LAST_INSERT_ID Dec 18, 2024
@systay systay added Type: Enhancement Logical improvement (somewhere between a bug and feature) and removed Type: Bug labels Dec 18, 2024
Signed-off-by: Andres Taylor <andres@planetscale.com>
@systay systay force-pushed the dml-last-insert-id branch from 02821a8 to a1c2707 Compare December 18, 2024 17:17
Signed-off-by: Andres Taylor <andres@planetscale.com>
Signed-off-by: Andres Taylor <andres@planetscale.com>
@systay systay marked this pull request as draft December 19, 2024 06:10
@systay
Copy link
Copy Markdown
Collaborator Author

systay commented Dec 19, 2024

we'll gut this PR into smaller ones to make it faster to merge
#17408 and
#17409

@systay systay closed this Dec 19, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Component: Query Serving Type: Enhancement Logical improvement (somewhere between a bug and feature)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug Report: result mismatch on LAST_INSERT_ID() between Vitess and MySQL

2 participants