-
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
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -157,7 +157,11 @@ func (e *PointGetExecutor) Next(ctx context.Context, req *chunk.Chunk) error { | |
tblID = e.tblInfo.ID | ||
} | ||
if e.idxInfo != nil { | ||
e.idxKey, err = encodeIndexKey(e.base(), e.tblInfo, e.idxInfo, e.idxVals, tblID) | ||
hasNull := false | ||
e.idxKey, hasNull, err = encodeIndexKey(e.base(), e.tblInfo, e.idxInfo, e.idxVals, tblID) | ||
if hasNull { | ||
return nil | ||
} | ||
if err != nil && !kv.ErrNotExist.Equal(err) { | ||
return err | ||
} | ||
|
@@ -299,9 +303,13 @@ func (e *PointGetExecutor) get(ctx context.Context, key kv.Key) ([]byte, error) | |
return e.snapshot.Get(ctx, key) | ||
} | ||
|
||
func encodeIndexKey(e *baseExecutor, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, idxVals []types.Datum, tID int64) (_ []byte, err error) { | ||
func encodeIndexKey(e *baseExecutor, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, idxVals []types.Datum, tID int64) (_ []byte, hasNull bool, err error) { | ||
sc := e.ctx.GetSessionVars().StmtCtx | ||
for i := range idxVals { | ||
if idxVals[i].IsNull() { | ||
hasNull = true | ||
continue | ||
} | ||
colInfo := tblInfo.Columns[idxInfo.Columns[i].Offset] | ||
// table.CastValue will append 0x0 if the string value's length is smaller than the BINARY column's length. | ||
// So we don't use CastValue for string value for now. | ||
|
@@ -313,19 +321,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 commentThe reason will be displayed to describe this comment to others. Learn more. We could return There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. After discussing with @tiancaiamao , I change the argument |
||
} | ||
} | ||
if err != nil { | ||
return nil, err | ||
return nil, false, err | ||
} | ||
} | ||
|
||
encodedIdxVals, err := codec.EncodeKey(sc, nil, idxVals...) | ||
if err != nil { | ||
return nil, err | ||
return nil, false, err | ||
} | ||
return tablecodec.EncodeIndexSeekKey(tID, idxInfo.ID, encodedIdxVals), nil | ||
return tablecodec.EncodeIndexSeekKey(tID, idxInfo.ID, encodedIdxVals), hasNull, nil | ||
} | ||
|
||
func decodeRowValToChunk(e *baseExecutor, tblInfo *model.TableInfo, handle int64, rowVal []byte, chk *chunk.Chunk, rd *rowcodec.ChunkDecoder) error { | ||
|
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