-
Notifications
You must be signed in to change notification settings - Fork 5.9k
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
executor: resolve errors caused by in null
in point/batch ...
#18848
Conversation
/run-all-tests |
LGTM |
/rebuild |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
@@ -302,6 +302,9 @@ func (e *PointGetExecutor) get(ctx context.Context, key kv.Key) ([]byte, error) | |||
func encodeIndexKey(e *baseExecutor, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, idxVals []types.Datum, tID int64) (_ []byte, err error) { | |||
sc := e.ctx.GetSessionVars().StmtCtx | |||
for i := range idxVals { | |||
if idxVals[i].IsNull() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we skip the null value, we built a non exists index key, I think it is not the right way to fix the bug.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why does the index key not exist? This loop is used to cast the idxVals
to target types, which is unnecessary for null type values.
After casting, all null values will also be encoded into the key.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But if the index has a null value, it is not encoded as unique index, the rowid is appended to the key.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I mean we should let the caller know the index value has a null value, we can not point get this key.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
okay
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated. PTAL @coocood
@@ -313,19 +320,19 @@ func encodeIndexKey(e *baseExecutor, tblInfo *model.TableInfo, idxInfo *model.In | |||
} else { | |||
idxVals[i], err = table.CastValue(e.ctx, idxVals[i], colInfo, true, false) | |||
if types.ErrOverflow.Equal(err) { | |||
return nil, kv.ErrNotExist | |||
return nil, false, kv.ErrNotExist |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could return nil, true, nil
, then outer do not need to check kv.ErrNotExist
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
After discussing with @tiancaiamao , I change the argument nonExist
to hasNull
. PTAL
LGTM |
/merge |
/run-all-tests |
@qw4990 merge failed. |
/rebuild |
/run-unit-test |
in null
in point/batch get operatorsin null
in point/batch ...
What problem does this PR solve?
Issue Number: close #18839
Problem Summary: resolve errors caused by
in null
in point/batch get operatorsWhat is changed and how it works?
Skip null values when casting.
Check List
Tests
Release note
in null
in point/batch get operators