Add MySQL 8.0.19+ VALUES alias support for ON DUPLICATE KEY UPDATE #4268
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Implements support for MySQL 8.0.19+ VALUES alias syntax in
INSERT ... ON DUPLICATE KEY UPDATE
statements.#4267
Implementation Details
New Classes:
ValuesAliasExpression
- Expression for handlingalias.column
referencesValuesAliasResolver
- ColumnResolver for resolving alias column referencesModified Classes:
Parser.java
- Added parsing forAS alias_name
after VALUES clauseCommandWithValues.java
- AddedvaluesAlias
andvaluesAliasResolver
fieldsInsert.java
- Extended to create and manage VALUES alias resolverKey Features:
database.getMode().onDuplicateKeyUpdate
)counter = counter + alias.counter
VALUES()
functionTesting
Added comprehensive test class
TestValuesAlias.java
covering:sql
-- Basic alias usage
INSERT INTO table (id, name) VALUES (1, 'John') AS new_user
ON DUPLICATE KEY UPDATE name = new_user.name;
-- Complex expressions
INSERT INTO stats (id, counter, total) VALUES (1, 3, 50.0) AS new_data
ON DUPLICATE KEY UPDATE counter = counter + new_data.counter, total = total + new_data.total;
-- Mixed syntax (new + old)
INSERT INTO table (id, name, value, extra) VALUES (1, 'test', 200, 'new') AS x
ON DUPLICATE KEY UPDATE name = x.name, value = VALUES(value), extra = x.extra;
-- Backward compatibility (old syntax still works)
INSERT INTO table (id, name) VALUES (1, 'test')
ON DUPLICATE KEY UPDATE name = VALUES(name);