Make UPDATE respect non nullability of columns#13644
Conversation
e43a179 to
064f753
Compare
|
failure is the same as here #13658 |
|
And singlestore failed because of #13677 (review) which should be fixed already |
| ImmutableList.Builder<Symbol> updatedColumnValuesBuilder = ImmutableList.builder(); | ||
| orderedColumnValues.forEach(columnValue -> updatedColumnValuesBuilder.add(planAndMappings.get(columnValue))); | ||
| TableMetadata tableMetadata = metadata.getTableMetadata(session, handle); | ||
| ImmutableMap<String, Integer> updatedColumnNameToIndex = IntStream.range(0, updatedColumnNames.size()) |
| TableMetadata tableMetadata = metadata.getTableMetadata(session, handle); | ||
| ImmutableMap<String, Integer> updatedColumnNameToIndex = IntStream.range(0, updatedColumnNames.size()) | ||
| .boxed() | ||
| .collect(toImmutableMap(updatedColumnNames::get, i -> i)); |
There was a problem hiding this comment.
i -> i -> index -> index. Or static import on Function.identity()
| ImmutableMap<String, Integer> updatedColumnNameToIndex = IntStream.range(0, updatedColumnNames.size()) | ||
| .boxed() | ||
| .collect(toImmutableMap(updatedColumnNames::get, i -> i)); | ||
| ImmutableList.Builder<Symbol> updatedNonNullableColumnsValuesBuilder = ImmutableList.builder(); |
There was a problem hiding this comment.
Please keep old variable name: updatedColumnValuesBuilder
| Assignments.Builder assignmentsBuilder = Assignments.builder(); | ||
| assignmentsBuilder.putIdentities(builder.getRoot().getOutputSymbols()); | ||
|
|
||
| for (ColumnMetadata column : tableMetadata.getColumns()) { |
There was a problem hiding this comment.
It feels the iteration would be simpler if you just iterate in parallel over orderedColumValues and targetColumnNames. IIUC those have same length so you can just do the iteration using integer index from 0..len(orderedColumValues).
The you would just look at columns you are interested in and look up for extra information (about nullability) by looking into tableMetadata. Currently you are iterating over all the columns and skipping once you are not interested in. This is counterintutive and requires using updatedColumnNameToIndex.
There was a problem hiding this comment.
So actually i thought about that but how would you look into tableMetadata for specific column ?
There is getColumn method but its implementation doesn't seem very efficient:
public ColumnMetadata getColumn(String name)
{
return getColumns().stream()
.filter(columnMetadata -> columnMetadata.getName().equals(name))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("Invalid column name: " + name));
}
We may end up going over that column list many many times. WDYT @losipiuk
There was a problem hiding this comment.
Can you just cache it as a name->CM map?
2f9c5ae to
64080ed
Compare
core/trino-main/src/main/java/io/trino/sql/planner/QueryPlanner.java
Outdated
Show resolved
Hide resolved
core/trino-main/src/main/java/io/trino/sql/planner/QueryPlanner.java
Outdated
Show resolved
Hide resolved
5e3e35c to
42a4caf
Compare
42a4caf to
76a761b
Compare
core/trino-main/src/main/java/io/trino/sql/planner/QueryPlanner.java
Outdated
Show resolved
Hide resolved
core/trino-main/src/main/java/io/trino/sql/planner/QueryPlanner.java
Outdated
Show resolved
Hide resolved
core/trino-main/src/main/java/io/trino/sql/planner/QueryPlanner.java
Outdated
Show resolved
Hide resolved
76a761b to
1e5b906
Compare
1e5b906 to
9f3ef15
Compare
|
@martint can we merge it ? or do you still have some concerns ? |
Description
a fix
core engine
it makes update queries respect non nullable columns and not insert nulls into them
Related issues, pull requests, and links
Fixes: #13435
Documentation
(x) No documentation is needed.
( ) Sufficient documentation is included in this PR.
( ) Documentation PR is available with #prnumber.
( ) Documentation issue #issuenumber is filed, and can be handled later.
Release notes
( ) No release notes entries required.
(x) Release notes entries required with the following suggested text: