Skip to content
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

tidb server panic #12385

Closed
AlexNewTao opened this issue Sep 25, 2019 · 6 comments · Fixed by #12413
Closed

tidb server panic #12385

AlexNewTao opened this issue Sep 25, 2019 · 6 comments · Fixed by #12413
Labels
type/bug The issue is confirmed as a bug.

Comments

@AlexNewTao
Copy link

AlexNewTao commented Sep 25, 2019

Bug Report

Please answer these questions before submitting your issue. Thanks!

  1. What did you do?
    If possible, provide a recipe for reproducing the error.

tidb panic

  1. What did you expect to see?

tidb server is normal,do not panic

  1. What did you see instead?

tidb panic

panic日志

{"log":"[2019/09/25 16:23:15.538 +08:00] [ERROR] [conn.go:600] [\"connection running loop panic\"] [conn=77163] [lastCmd=\"select t1.xxx, t1.xxx, t1.axx, t1.scxx, t1.txx, t1.vote_type, if(t1.time = t3.time, 1, 0) as alreadxxx from voting_xxx t1 left join votxxx t2 on t1.autxxx = t2.usxxx left join poc_xxx t3 on t1.userxxx = t3.usexxx and t1.notxxx = t3.notxxx and t1.user_id = t3.user_id and t1.vote_type = t3.vote_type where (ifnull(t2.d_xxx, 0) + ifnull(t2.d_lenxxxe, 0)) \u003e 0 and ((t1.time = t3.time) or t1.time \u003e UNIX_TIMESTAMP(if(t3.time is null, DATE_ADD(Now(), INTERVAL -1 YEAR), DATE_ADD(FROM_UNIXTIME(t3.time), INTERVAL 1 YEAR))))\"] [err=\"\\\"invalid memory address or nil pointer dereference\\\"\"] [stack=\"goroutine 34561956 [running]:\\ngithub.com/pingcap/tidb/server.(*clientConn).Run.func1(0x22a1e00, 0xc1e71de0f0, 0xc00bea3110)\\n\\t/go/src/github.com/pingcap/tidb/server/conn.go:598 +0xee\\npanic(0x1dd2d80, 0x2fec9b0)\\n\\t/usr/local/go/src/runtime/panic.go:522 +0x1b5\\ngithub.com/pingcap/tidb/types.(*MyDecimal).GetDigitsFrac(...)\\n\\t/go/src/github.com/pingcap/tidb/types/mydecimal.go:250\\ngithub.com/pingcap/tidb/expression.(*fromUnixTimeFunctionClass).getFunction(0xc0002e49a0, 0x22db520, 0xc003933590, 0xc00a190b20, 0x1, 0x1, 0x1, 0x1, 0xc00a190b00, 0x1)\\n\\t/go/src/github.com/pingcap/tidb/expression/builtin_time.go:1583 +0x35f\\ngithub.com/pingcap/tidb/expression.newFunctionImpl(0x22db520, 0xc003933590, 0xc0002e2701, 0xc20eb90630, 0xd, 0xc11c916600, 0xc00a190af0, 0x1, 0x1, 0xc00ac5e598, ...)\\n\\t/go/src/github.com/pingcap/tidb/expression/scalar_function.go:87 +0x1f1\\ngithub.com/pingcap/tidb/expression.NewFunction(...)\\n\\t/go/src/github.com/pingcap/tidb/expression/scalar_function.go:107\\ngithub.com/pingcap/tidb/expression.NewFunctionInternal(0x22db520, 0xc003933590, 0xc20eb90630, 0xd, 0xc11c916600, 0xc00a190af0, 0x1, 0x1, 0xc11c916480, 0xc00a190ad0)\\n\\t/go/src/github.com/pingcap/tidb/expression/scalar_function.go:117 +0x96\\ngithub.com/pingcap/tidb/expression.EvaluateExprWithNull(0x22db520, 0xc003933590, 0xc169d24ac0, 0x22dc960, 0xc229314280, 0xc00a190ad0, 0x1)\\n\\t/go/src/github.com/pingcap/tidb/expression/expression.go:278 +0x21b\\ngithub.com/pingcap/tidb/expression.EvaluateExprWithNull(0x22db520, 0xc003933590, 0xc169d24ac0, 0x22dc960, 0xc229314320, 0x22dc7e0, 0xc1b3bbacb0)\\n\\t/go/src/github.com/pingcap/tidb/expression/expression.go:276 +0x140\\ngithub.com/pingcap/tidb/expression.EvaluateExprWithNull(0x22db520, 0xc003933590, 0xc169d24ac0, 0x22dc960, 0xc229314370, 0xc00a190aa0, 0x1)\\n\\t/go/src/github.com/pingcap/tidb/expression/expression.go:276 +0x140\\ngithub.com/pingcap/tidb/expression.EvaluateExprWithNull(0x22db520, 0xc003933590, 0xc169d24ac0, 0x22dc960, 0xc2293143c0, 0x22dc960, 0xc229314b90)\\n\\t/go/src/github.com/pingcap/tidb/expression/expression.go:276 +0x140\\ngithub.com/pingcap/tidb/expression.EvaluateExprWithNull(0x22db520, 0xc003933590, 0xc169d24ac0, 0x22dc960, 0xc229314a50, 0x22dc7e0, 0xc1b3bbb420)\\n\\t/go/src/github.com/pingcap/tidb/expression/expression.go:276 +0x140\\ngithub.com/pingcap/tidb/expression.EvaluateExprWithNull(0x22db520, 0xc003933590, 0xc169d24ac0, 0x22dc960, 0xc229314aa0, 0x22dc960, 0xc229314aa0)\\n\\t/go/src/github.com/pingcap/tidb/expression/expression.go:276 +0x140\\ngithub.com/pingcap/tidb/planner/core.isNullRejected(0x22db520, 0xc003933590, 0xc169d24ac0, 0x22dc960, 0xc229314aa0, 0x0)\\n\\t/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:311 +0xb9\\ngithub.com/pingcap/tidb/planner/core.simplifyOuterJoin(0xc18d964900, 0xc198b19140, 0x2, 0x2)\\n\\t/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:291 +0x147\\ngithub.com/pingcap/tidb/planner/core.(*LogicalJoin).PredicatePushDown(0xc18d964900, 0xc198b19140, 0x2, 0x2, 0x3366990, 0x0, 0x0, 0x0, 0x2)\\n\\t/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:114 +0x6a\\ngithub.com/pingcap/tidb/planner/core.(*LogicalSelection).PredicatePushDown(0xc0f3441780, 0x3366990, 0x0, 0x0, 0xbf909c, 0x0, 0x1f0d340, 0xc229314501, 0x3366990)\\n\\t/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:77 +0x160\\ngithub.com/pingcap/tidb/planner/core.(*baseLogicalPlan).PredicatePushDown(0xc16de5e368, 0x3366990, 0x0, 0x0, 0xc194c4cd80, 0xc0f3441780, 0xc194c4cd80, 0x1, 0x22dd320)\\n\\t/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:56 +0xa6\\ngithub.com/pingcap/tidb/planner/core.(*LogicalProjection).PredicatePushDown(0xc16de5e360, 0x0, 0x0, 0x0, 0xc16de5e360, 0xc194c4cd80, 0x0, 0x22dd260, 0xc16de5e360)\\n\\t/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:337 +0x24f\\ngithub.com/pingcap/tidb/planner/core.(*ppdSolver).optimize(0x3366420, 0x22a1e00, 0xc1e71de0f0, 0x22dd260, 0xc16de5e360, 0x22dd260, 0xc16de5e360, 0x0, 0x0)\\n\\t/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:29 +0x42\\ngithub.com/pingcap/tidb/pl\"] [stack=\"github.com/pingcap/tidb/server.(*clientConn).Run.func1\\n\\t/go/src/github.com/pingcap/tidb/server/conn.go:600\\nruntime.gopanic\\n\\t/usr/local/go/src/runtime/panic.go:522\\nruntime.panicmem\\n\\t/usr/local/go/src/runtime/panic.go:82\\nruntime.sigpanic\\n\\t/usr/local/go/src/runtime/signal_unix.go:390\\ngithub.com/pingcap/tidb/expression.(*fromUnixTimeFunctionClass).getFunction\\n\\t/go/src/github.com/pingcap/tidb/expression/builtin_time.go:1587\\ngithub.com/pingcap/tidb/expression.(*fromUnixTimeFunctionClass).getFunction\\n\\t/go/src/github.com/pingcap/tidb/expression/builtin_time.go:1583\\ngithub.com/pingcap/tidb/expression.newFunctionImpl\\n\\t/go/src/github.com/pingcap/tidb/expression/scalar_function.go:87\\ngithub.com/pingcap/tidb/expression.NewFunction\\n\\t/go/src/github.com/pingcap/tidb/expression/scalar_function.go:107\\ngithub.com/pingcap/tidb/expression.NewFunctionInternal\\n\\t/go/src/github.com/pingcap/tidb/expression/scalar_function.go:117\\ngithub.com/pingcap/tidb/expression.EvaluateExprWithNull\\n\\t/go/src/github.com/pingcap/tidb/expression/expression.go:278\\ngithub.com/pingcap/tidb/expression.EvaluateExprWithNull\\n\\t/go/src/github.com/pingcap/tidb/expression/expression.go:276\\ngithub.com/pingcap/tidb/expression.EvaluateExprWithNull\\n\\t/go/src/github.com/pingcap/tidb/expression/expression.go:276\\ngithub.com/pingcap/tidb/expression.EvaluateExprWithNull\\n\\t/go/src/github.com/pingcap/tidb/expression/expression.go:276\\ngithub.com/pingcap/tidb/expression.EvaluateExprWithNull\\n\\t/go/src/github.com/pingcap/tidb/expression/expression.go:276\\ngithub.com/pingcap/tidb/expression.EvaluateExprWithNull\\n\\t/go/src/github.com/pingcap/tidb/expression/expression.go:276\\ngithub.com/pingcap/tidb/planner/core.isNullRejected\\n\\t/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:311\\ngithub.com/pingcap/tidb/planner/core.simplifyOuterJoin\\n\\t/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:291\\ngithub.com/pingcap/tidb/planner/core.(*LogicalJoin).PredicatePushDown\\n\\t/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:114\\ngithub.com/pingcap/tidb/planner/core.(*LogicalSelection).PredicatePushDown\\n\\t/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:77\\ngithub.com/pingcap/tidb/planner/core.(*baseLogicalPlan).PredicatePushDown\\n\\t/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:56\\ngithub.com/pingcap/tidb/planner/core.(*LogicalProjection).PredicatePushDown\\n\\t/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:337\\ngithub.com/pingcap/tidb/planner/core.(*ppdSolver).optimize\\n\\t/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:29\\ngithub.com/pingcap/tidb/planner/core.logicalOptimize\\n\\t/go/src/github.com/pingcap/tidb/planner/core/optimizer.go:133\\ngithub.com/pingcap/tidb/planner/core.DoOptimize\\n\\t/go/src/github.com/pingcap/tidb/planner/core/optimizer.go:103\\ngithub.com/pingcap/tidb/planner.Optimize\\n\\t/go/src/github.com/pingcap/tidb/planner/optimize.go:71\\ngithub.com/pingcap/tidb/executor.(*Compiler).compile\\n\\t/go/src/github.com/pingcap/tidb/executor/compiler.go:78\\ngithub.com/pingcap/tidb/executor.(*Compiler).Compile\\n\\t/go/src/github.com/pingcap/tidb/executor/compiler.go:55\\ngithub.com/pingcap/tidb/session.(*session).execute\\n\\t/go/src/github.com/pingcap/tidb/session/session.go:1039\\ngithub.com/pingcap/tidb/session.(*session).Execute\\n\\t/go/src/github.com/pingcap/tidb/session/session.go:994\\ngithub.com/pingcap/tidb/server.(*TiDBContext)Execute\\n\\t/go/src/github.com/pingcap/tidb/server/driver_tidb.go:246\\ngithub.com/pingcap/tidb/server.(*clientConn).handleQuery
\\n\\t/go/src/github.com/pingcap/tidb/server/conn.go:1179\\ngithub.com/pingcap/tidb/server.(*clientConn).dispatch\\n\\t/go/src/github.com/pingcap/tidb/server/conn.go:897\\ngithub.com/pingcap/tidb/server.(*clientConn).Run\\n\\t/go/src/github.com/pingcap/tidb/server/conn.go:652\\ngithub.com/pingcap/tidb/server.(*Server).onConn\\n\\t/go/src/github.com/pingcap/tidb/server/server.go:440\"]\n","stream":"stdout","time":"2019-09-25T08:23:15.539089263Z"}
  1. What version of TiDB are you using (tidb-server -V or run select tidb_version(); on TiDB)?
    v 3.0.2
@AlexNewTao AlexNewTao added the type/bug The issue is confirmed as a bug. label Sep 25, 2019
@zz-jason
Copy link
Member

@AlexNewTao Thanks for your report, could you post the full error stack to help us identify the problem?

BTW, it would be very helpful if you can provide the minimal reproduce step for this issue.

@AlexNewTao
Copy link
Author

log before panic

{"log":"[2019/09/25 16:23:14.338 +08:00] [INFO] [session.go:1847] [\"CRUCIAL OPERATION\"] [conn=77163] [schemaVersion=481] [cur_db=fp_staging] [sql=\"CREATE TABLE IF NOT EXISTS voting_coxxxxx91600 (\\n\\t\\tnote_id integer NOT NULL,\\n\\t\\tcomment_id integer NOT NULL,\\n\\t\\tuser_id integer NOT NULL,\\n\\t\\tvalid_content tinyint(1) DEFAULT '0',\\n\\t\\tKEY index_nid (note_id)\\n\\t)\"] [user=xxxxx]\n","stream":"stdout","time":"2019-09-25T08:23:14.338368274Z"}
{"log":"[2019/09/25 16:23:14.418 +08:00] [INFO] [session.go:1847] [\"CRUCIAL OPERATION\"] [conn=77163] [schemaVersion=481] [cur_db=fp_staging] [sql=\"CREATE TABLE IF NOT EXISTS vxxxxx (\\n\\t\\tnote_id integer NOT NULL,\\n\\t\\tuid varchar(30) NOT NULL,\\n\\t\\tKEY index_nid (note_id)\\n\\t)\"] [user=xxx]\n","stream":"stdout","time":"2019-09-25T08:23:14.418205619Z"}

@AlexNewTao
Copy link
Author

it's normal in query

select t1.time, 
t3.time,  
(ifnull(t2.d_balance, 0) + ifnull(t2.d_lending_balance, 0)) as zz, 
UNIX_TIMESTAMP(if(t3.time is null, DATE_ADD(Now(), INTERVAL -1 YEAR), DATE_ADD(FROM_UNIXTIME(t3.time), INTERVAL 1 YEAR))) as zc 
from voting_vxxxx t1 
left join voting_xxxx0 t2 
   on t1.auxxx_id = t2.user_id 
left join poc_voxxxxns t3 
   on t1.note_id = t3.note_id and t1.user_id = t3.user_id and t1.vote_type = t3.vote_type 
limit 10;

but it will cause tidb panic when add where condition

select t1.time, 
t3.time,  
(ifnull(t2.d_balance, 0) + ifnull(t2.d_lending_balance, 0)) as zz, 
UNIX_TIMESTAMP(if(t3.time is null, DATE_ADD(Now(), INTERVAL -1 YEAR), DATE_ADD(FROM_UNIXTIME(t3.time), INTERVAL 1 YEAR))) as zc 
from voting_vxxxx t1 
left join voting_xxxx0 t2 
   on t1.auxxx_id = t2.user_id 
left join poc_voxxxxns t3 
   on t1.note_id = t3.note_id and t1.user_id = t3.user_id and t1.vote_type = t3.vote_type 
where t1.time > UNIX_TIMESTAMP(if(t3.time is null, DATE_ADD(Now(), INTERVAL -1 YEAR), DATE_ADD(FROM_UNIXTIME(t3.time), INTERVAL 1 YEAR)))
limit 10;

UNIX_TIMESTAMP(if(t3.time is null, DATE_ADD(Now(), INTERVAL -1 YEAR), DATE_ADD(FROM_UNIXTIME(t3.time), INTERVAL 1 YEAR)))

adding to call stack,It is very likely that these time functions trigger panic github.com/pingcap/tidb/types.(*MyDecimal).GetDigitsFrac(...)\n\t/go/src/github.com/pingcap/tidb/types/mydecimal.go:250\ngithub.com/pingcap/tidb/expression.(*fromUnixTimeFunctionClass).getFunction

@zz-jason
Copy link
Member

The formatted panic log is:

{"log":"[2019/09/25 16:23:15.538 +08:00] [ERROR] [conn.go:600] [\"connection running loop panic\"] [conn=77163] [lastCmd=\"select t1.xxx, t1.xxx, t1.axx, t1.scxx, t1.txx, t1.vote_type, if(t1.time = t3.time, 1, 0) as alreadxxx from voting_xxx t1 left join votxxx t2 on t1.autxxx = t2.usxxx left join poc_xxx t3 on t1.userxxx = t3.usexxx and t1.notxxx = t3.notxxx and t1.user_id = t3.user_id and t1.vote_type = t3.vote_type where (ifnull(t2.d_xxx, 0) + ifnull(t2.d_lenxxxe, 0)) \u003e 0 and ((t1.time = t3.time) or t1.time \u003e UNIX_TIMESTAMP(if(t3.time is null, DATE_ADD(Now(), INTERVAL -1 YEAR), DATE_ADD(FROM_UNIXTIME(t3.time), INTERVAL 1 YEAR))))\"] [err=\"\\\"invalid memory address or nil pointer dereference\\\"\"] [stack=\"goroutine 34561956 [running]:
github.com/pingcap/tidb/server.(*clientConn).Run.func1(0x22a1e00, 0xc1e71de0f0, 0xc00bea3110)
	/go/src/github.com/pingcap/tidb/server/conn.go:598 +0xee
panic(0x1dd2d80, 0x2fec9b0)
	/usr/local/go/src/runtime/panic.go:522 +0x1b5
github.com/pingcap/tidb/types.(*MyDecimal).GetDigitsFrac(...)
	/go/src/github.com/pingcap/tidb/types/mydecimal.go:250
github.com/pingcap/tidb/expression.(*fromUnixTimeFunctionClass).getFunction(0xc0002e49a0, 0x22db520, 0xc003933590, 0xc00a190b20, 0x1, 0x1, 0x1, 0x1, 0xc00a190b00, 0x1)
	/go/src/github.com/pingcap/tidb/expression/builtin_time.go:1583 +0x35f
github.com/pingcap/tidb/expression.newFunctionImpl(0x22db520, 0xc003933590, 0xc0002e2701, 0xc20eb90630, 0xd, 0xc11c916600, 0xc00a190af0, 0x1, 0x1, 0xc00ac5e598, ...)
	/go/src/github.com/pingcap/tidb/expression/scalar_function.go:87 +0x1f1
github.com/pingcap/tidb/expression.NewFunction(...)
	/go/src/github.com/pingcap/tidb/expression/scalar_function.go:107
github.com/pingcap/tidb/expression.NewFunctionInternal(0x22db520, 0xc003933590, 0xc20eb90630, 0xd, 0xc11c916600, 0xc00a190af0, 0x1, 0x1, 0xc11c916480, 0xc00a190ad0)
	/go/src/github.com/pingcap/tidb/expression/scalar_function.go:117 +0x96
github.com/pingcap/tidb/expression.EvaluateExprWithNull(0x22db520, 0xc003933590, 0xc169d24ac0, 0x22dc960, 0xc229314280, 0xc00a190ad0, 0x1)
	/go/src/github.com/pingcap/tidb/expression/expression.go:278 +0x21b
github.com/pingcap/tidb/expression.EvaluateExprWithNull(0x22db520, 0xc003933590, 0xc169d24ac0, 0x22dc960, 0xc229314320, 0x22dc7e0, 0xc1b3bbacb0)
	/go/src/github.com/pingcap/tidb/expression/expression.go:276 +0x140
github.com/pingcap/tidb/expression.EvaluateExprWithNull(0x22db520, 0xc003933590, 0xc169d24ac0, 0x22dc960, 0xc229314370, 0xc00a190aa0, 0x1)
	/go/src/github.com/pingcap/tidb/expression/expression.go:276 +0x140
github.com/pingcap/tidb/expression.EvaluateExprWithNull(0x22db520, 0xc003933590, 0xc169d24ac0, 0x22dc960, 0xc2293143c0, 0x22dc960, 0xc229314b90)
	/go/src/github.com/pingcap/tidb/expression/expression.go:276 +0x140
github.com/pingcap/tidb/expression.EvaluateExprWithNull(0x22db520, 0xc003933590, 0xc169d24ac0, 0x22dc960, 0xc229314a50, 0x22dc7e0, 0xc1b3bbb420)
	/go/src/github.com/pingcap/tidb/expression/expression.go:276 +0x140
github.com/pingcap/tidb/expression.EvaluateExprWithNull(0x22db520, 0xc003933590, 0xc169d24ac0, 0x22dc960, 0xc229314aa0, 0x22dc960, 0xc229314aa0)
	/go/src/github.com/pingcap/tidb/expression/expression.go:276 +0x140
github.com/pingcap/tidb/planner/core.isNullRejected(0x22db520, 0xc003933590, 0xc169d24ac0, 0x22dc960, 0xc229314aa0, 0x0)
	/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:311 +0xb9
github.com/pingcap/tidb/planner/core.simplifyOuterJoin(0xc18d964900, 0xc198b19140, 0x2, 0x2)
	/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:291 +0x147
github.com/pingcap/tidb/planner/core.(*LogicalJoin).PredicatePushDown(0xc18d964900, 0xc198b19140, 0x2, 0x2, 0x3366990, 0x0, 0x0, 0x0, 0x2)
	/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:114 +0x6a
github.com/pingcap/tidb/planner/core.(*LogicalSelection).PredicatePushDown(0xc0f3441780, 0x3366990, 0x0, 0x0, 0xbf909c, 0x0, 0x1f0d340, 0xc229314501, 0x3366990)
	/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:77 +0x160
github.com/pingcap/tidb/planner/core.(*baseLogicalPlan).PredicatePushDown(0xc16de5e368, 0x3366990, 0x0, 0x0, 0xc194c4cd80, 0xc0f3441780, 0xc194c4cd80, 0x1, 0x22dd320)
	/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:56 +0xa6
github.com/pingcap/tidb/planner/core.(*LogicalProjection).PredicatePushDown(0xc16de5e360, 0x0, 0x0, 0x0, 0xc16de5e360, 0xc194c4cd80, 0x0, 0x22dd260, 0xc16de5e360)
	/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:337 +0x24f
github.com/pingcap/tidb/planner/core.(*ppdSolver).optimize(0x3366420, 0x22a1e00, 0xc1e71de0f0, 0x22dd260, 0xc16de5e360, 0x22dd260, 0xc16de5e360, 0x0, 0x0)
	/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:29 +0x42
github.com/pingcap/tidb/pl\"] [stack=\"github.com/pingcap/tidb/server.(*clientConn).Run.func1
	/go/src/github.com/pingcap/tidb/server/conn.go:600
runtime.gopanic
	/usr/local/go/src/runtime/panic.go:522
runtime.panicmem
	/usr/local/go/src/runtime/panic.go:82
runtime.sigpanic
	/usr/local/go/src/runtime/signal_unix.go:390
github.com/pingcap/tidb/expression.(*fromUnixTimeFunctionClass).getFunction
	/go/src/github.com/pingcap/tidb/expression/builtin_time.go:1587
github.com/pingcap/tidb/expression.(*fromUnixTimeFunctionClass).getFunction
	/go/src/github.com/pingcap/tidb/expression/builtin_time.go:1583
github.com/pingcap/tidb/expression.newFunctionImpl
	/go/src/github.com/pingcap/tidb/expression/scalar_function.go:87
github.com/pingcap/tidb/expression.NewFunction
	/go/src/github.com/pingcap/tidb/expression/scalar_function.go:107
github.com/pingcap/tidb/expression.NewFunctionInternal
	/go/src/github.com/pingcap/tidb/expression/scalar_function.go:117
github.com/pingcap/tidb/expression.EvaluateExprWithNull
	/go/src/github.com/pingcap/tidb/expression/expression.go:278
github.com/pingcap/tidb/expression.EvaluateExprWithNull
	/go/src/github.com/pingcap/tidb/expression/expression.go:276
github.com/pingcap/tidb/expression.EvaluateExprWithNull
	/go/src/github.com/pingcap/tidb/expression/expression.go:276
github.com/pingcap/tidb/expression.EvaluateExprWithNull
	/go/src/github.com/pingcap/tidb/expression/expression.go:276
github.com/pingcap/tidb/expression.EvaluateExprWithNull
	/go/src/github.com/pingcap/tidb/expression/expression.go:276
github.com/pingcap/tidb/expression.EvaluateExprWithNull
	/go/src/github.com/pingcap/tidb/expression/expression.go:276
github.com/pingcap/tidb/planner/core.isNullRejected
	/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:311
github.com/pingcap/tidb/planner/core.simplifyOuterJoin
	/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:291
github.com/pingcap/tidb/planner/core.(*LogicalJoin).PredicatePushDown
	/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:114
github.com/pingcap/tidb/planner/core.(*LogicalSelection).PredicatePushDown
	/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:77
github.com/pingcap/tidb/planner/core.(*baseLogicalPlan).PredicatePushDown
	/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:56
github.com/pingcap/tidb/planner/core.(*LogicalProjection).PredicatePushDown
	/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:337
github.com/pingcap/tidb/planner/core.(*ppdSolver).optimize
	/go/src/github.com/pingcap/tidb/planner/core/rule_predicate_push_down.go:29
github.com/pingcap/tidb/planner/core.logicalOptimize
	/go/src/github.com/pingcap/tidb/planner/core/optimizer.go:133
github.com/pingcap/tidb/planner/core.DoOptimize
	/go/src/github.com/pingcap/tidb/planner/core/optimizer.go:103
github.com/pingcap/tidb/planner.Optimize
	/go/src/github.com/pingcap/tidb/planner/optimize.go:71
github.com/pingcap/tidb/executor.(*Compiler).compile
	/go/src/github.com/pingcap/tidb/executor/compiler.go:78
github.com/pingcap/tidb/executor.(*Compiler).Compile
	/go/src/github.com/pingcap/tidb/executor/compiler.go:55
github.com/pingcap/tidb/session.(*session).execute
	/go/src/github.com/pingcap/tidb/session/session.go:1039
github.com/pingcap/tidb/session.(*session).Execute
	/go/src/github.com/pingcap/tidb/session/session.go:994
github.com/pingcap/tidb/server.(*TiDBContext)Execute
	/go/src/github.com/pingcap/tidb/server/driver_tidb.go:246
github.com/pingcap/tidb/server.(*clientConn).handleQuery

From the stack, seems this panic happens in the predicate pushdown rule.

@AlexNewTao Could you provide us the table schema and the panic query?

@AlexNewTao
Copy link
Author

AlexNewTao commented Sep 25, 2019

@zz-jason

the table schema info is already given to 张曾钧,include panic query;

For some reason, it is inconvenient to post directly here.

btw,according to our test,If you modify the time function to a specific value, it will not cause panic, you can check it from this direction.

@zz-jason
Copy link
Member

Minimal Reproduce Steps

reproduced on my local machine, a minimal reproduce step is:

drop table if exists t;
create table t(a bigint, b bigint);

-- the following sql cause the same panic:
select * from t t1 left join t t2 on t1.a=t2.a where from_unixtime(t2.b);

The panic stack is:

github.com/pingcap/tidb/server.(*clientConn).Run.func1(0x56db8c0, 0xc00cbebc80, 0xc00034bc70)
    /Users/zhangjian/Code/tidb/server/conn.go:598 +0xee
panic(0x5204700, 0x658f240)
    /opt/goroot/src/runtime/panic.go:679 +0x1b2
github.com/pingcap/tidb/types.(*MyDecimal).GetDigitsFrac(...)
    /Users/zhangjian/Code/tidb/types/mydecimal.go:250
github.com/pingcap/tidb/expression.(*fromUnixTimeFunctionClass).getFunction(0xc000107400, 0x57115e0, 0xc00773a870, 0xc008d41740, 0x1, 0x1, 0x1, 0x1, 0xc008d41720, 0x1)
    /Users/zhangjian/Code/tidb/expression/builtin_time.go:1583 +0x35e
github.com/pingcap/tidb/expression.newFunctionImpl(0x57115e0, 0xc00773a870, 0xc00047a801, 0xc008e1b180, 0xd, 0xc008f792c0, 0xc008d41710, 0x1, 0x1, 0xc008b14428, ...)
    /Users/zhangjian/Code/tidb/expression/scalar_function.go:87 +0x1f1
github.com/pingcap/tidb/expression.NewFunction(...)
    /Users/zhangjian/Code/tidb/expression/scalar_function.go:107
github.com/pingcap/tidb/expression.NewFunctionInternal(0x57115e0, 0xc00773a870, 0xc008e1b180, 0xd, 0xc008f792c0, 0xc008d41710, 0x1, 0x1, 0xc008f79140, 0xc008d416f0)
    /Users/zhangjian/Code/tidb/expression/scalar_function.go:117 +0x92
github.com/pingcap/tidb/expression.EvaluateExprWithNull(0x57115e0, 0xc00773a870, 0xc008e39400, 0x57128a0, 0xc008e3b9f0, 0xc008d416f0, 0x1)
    /Users/zhangjian/Code/tidb/expression/expression.go:278 +0x218
github.com/pingcap/tidb/expression.EvaluateExprWithNull(0x57115e0, 0xc00773a870, 0xc008e39400, 0x57128a0, 0xc008e3ba90, 0x5712720, 0xc006de33b0)
    /Users/zhangjian/Code/tidb/expression/expression.go:276 +0x13e
github.com/pingcap/tidb/expression.EvaluateExprWithNull(0x57115e0, 0xc00773a870, 0xc008e39400, 0x57128a0, 0xc008e3bae0, 0xc008d416c0, 0x1)
    /Users/zhangjian/Code/tidb/expression/expression.go:276 +0x13e
github.com/pingcap/tidb/expression.EvaluateExprWithNull(0x57115e0, 0xc00773a870, 0xc008e39400, 0x57128a0, 0xc008e3bb30, 0x57128a0, 0xc008e3bc70)
    /Users/zhangjian/Code/tidb/expression/expression.go:276 +0x13e
github.com/pingcap/tidb/expression.EvaluateExprWithNull(0x57115e0, 0xc00773a870, 0xc008e39400, 0x57128a0, 0xc008e3bc20, 0x57128a0, 0xc008e3bc20)
    /Users/zhangjian/Code/tidb/expression/expression.go:276 +0x13e
github.com/pingcap/tidb/planner/core.isNullRejected(0x57115e0, 0xc00773a870, 0xc008e39400, 0x57128a0, 0xc008e3bc20, 0xc006dec900)
    /Users/zhangjian/Code/tidb/planner/core/rule_predicate_push_down.go:311 +0xb9
github.com/pingcap/tidb/planner/core.simplifyOuterJoin(0xc00ce58180, 0xc008d416a0, 0x1, 0x1)
    /Users/zhangjian/Code/tidb/planner/core/rule_predicate_push_down.go:291 +0x148
github.com/pingcap/tidb/planner/core.(*LogicalJoin).PredicatePushDown(0xc00ce58180, 0xc008d416a0, 0x1, 0x1, 0x660c908, 0x0, 0x0, 0x0, 0x1)
    /Users/zhangjian/Code/tidb/planner/core/rule_predicate_push_down.go:114 +0x6a
github.com/pingcap/tidb/planner/core.(*LogicalSelection).PredicatePushDown(0xc008f7a180, 0x660c908, 0x0, 0x0, 0x40484fc, 0x0, 0x5341f80, 0x5712601, 0x660c908)
    /Users/zhangjian/Code/tidb/planner/core/rule_predicate_push_down.go:77 +0x163
github.com/pingcap/tidb/planner/core.(*baseLogicalPlan).PredicatePushDown(0xc008f60998, 0x660c908, 0x0, 0x0, 0xc008f60990, 0xc008eb1c80, 0xc008f7a180, 0xc008eb1c80, 0x1)
    /Users/zhangjian/Code/tidb/planner/core/rule_predicate_push_down.go:56 +0xa6
github.com/pingcap/tidb/planner/core.(*LogicalProjection).PredicatePushDown(0xc008f60990, 0x0, 0x0, 0x0, 0xc008f60990, 0xc008eb1c80, 0x0, 0x5713020, 0xc008f60990)
    /Users/zhangjian/Code/tidb/planner/core/rule_predicate_push_down.go:337 +0x24f
github.com/pingcap/tidb/planner/core.(*ppdSolver).optimize(0x660c500, 0x56db8c0, 0xc00cbebc80, 0x5713020, 0xc008f60990, 0x5713020, 0xc008f60990, 0x0, 0x0)
    /Users/zhangjian/Code/tidb/planner/core/rule_predicate_push_down.go:29 +0x42
github.com/pingcap/tidb/planner/core.logicalOptimize(0x56db8c0, 0xc00cbebc80, 0xd1, 0x5713020, 0xc008f60990, 0x5344b20, 0x53ff080, 0x56a5301, 0x5713020)
    /Users/zhangjian/Code/tidb/planner/core/optimizer.go:133 +0xea
github.com/pingcap/tidb/planner/core.DoOptimize(0x56db8c0, 0xc00cbebc80, 0xd1, 0x5713020, 0xc008f60990, 0xc008

RCA

For the outer join, which is left join in the above sql, the planner will check whether the filter on the join result is null-rejective.

In the above case, the filter is from_unixtime(t2.b). To check whether it's null-rejective, the planner replaces t2.b with null and evaluate whether the function from_unixtime(null) is false.

The panic happens when the planner tries to calculate the fsp for the timestamp value in line 1583:

1578         } else if isArg0Con {
1579             arg0, _, err1 := args[0].EvalDecimal(ctx, chunk.Row{})
1580             if err1 != nil {
1581                 return sig, err1
1582             }
1583             fsp := int(arg0.GetDigitsFrac())
1584             if fsp > types.MaxFsp {
1585                 fsp = types.MaxFsp
1586             }
1587             bf.tp.Decimal = fsp

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type/bug The issue is confirmed as a bug.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants