-
Notifications
You must be signed in to change notification settings - Fork 5.8k
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: fix hash join between datetime and timestamp #25915
Changes from all commits
30b99e9
0fd8cfd
1c48aef
154565f
ecfbd3f
66fa1bd
dc4fc62
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 |
---|---|---|
|
@@ -330,14 +330,7 @@ func encodeHashChunkRowIdx(sc *stmtctx.StatementContext, row chunk.Row, tp *type | |
case mysql.TypeDate, mysql.TypeDatetime, mysql.TypeTimestamp: | ||
flag = uintFlag | ||
t := row.GetTime(idx) | ||
// Encoding timestamp need to consider timezone. | ||
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. I think here is right, the decoding process should take the timezone into consideration. 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. Since we do not store the timezone information in the TiKV, all timestamp data is stored as UTC. The read back process should convert the uint64 to the correct timestamp considering the timezone 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.
As I see, the hash table is not a persistent table, It's used to do join operator after being getted from kv and converted to the right timezone, other than store in kv. 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. For instance, this sql can produce the right result, because we do not convert timezone when do join. Timezone convertion should be considered when it was getted from kv. select /*+ MERGE_JOIN(tt1, tt2) */ * from tt1 inner join tt2 on tt1.ts=tt2.ts; 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. Exactly |
||
// If it's not in UTC, transform to UTC first. | ||
if t.Type() == mysql.TypeTimestamp && sc.TimeZone != time.UTC { | ||
err = t.ConvertTimeZone(sc.TimeZone, time.UTC) | ||
if err != nil { | ||
return | ||
} | ||
} | ||
|
||
var v uint64 | ||
v, err = t.ToPackedUint() | ||
if err != nil { | ||
|
@@ -507,14 +500,7 @@ func HashChunkSelected(sc *stmtctx.StatementContext, h []hash.Hash64, chk *chunk | |
isNull[i] = !ignoreNull | ||
} else { | ||
buf[0] = uintFlag | ||
// Encoding timestamp need to consider timezone. | ||
// If it's not in UTC, transform to UTC first. | ||
if t.Type() == mysql.TypeTimestamp && sc.TimeZone != time.UTC { | ||
err = t.ConvertTimeZone(sc.TimeZone, time.UTC) | ||
if err != nil { | ||
return | ||
} | ||
} | ||
|
||
var v uint64 | ||
v, err = t.ToPackedUint() | ||
if err != nil { | ||
|
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.
Should we reset to
time_zone
to+08
?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.
thx, it fixed~