Bug Description
PREPARE + EXECUTE of INSERT ... ON DUPLICATE KEY UPDATE on a table with PRIMARY KEY + extra UNIQUE KEY causes nil pointer dereference.
Repro
CREATE TABLE t (id VARCHAR(64) PRIMARY KEY, val VARCHAR(128) NOT NULL, UNIQUE KEY uq_val (val));
SET @id='id1', @val='v1';
PREPARE stmt FROM 'INSERT INTO t (id, val) VALUES (?, ?) ON DUPLICATE KEY UPDATE val = VALUES(val)';
EXECUTE stmt USING @id, @val; -- PANIC
Direct INSERT works. PREPARE works with single PK only.
Root Cause
- PREPARE sets StmtSnapshotTS, EXECUTE has newer SnapshotTS
- InitialSnapshotTS < currentTS triggers checkSnapshotAdvancedDuplicates
- join.go:627 passes [nil, buildBat] to Eval
- evalExpression.go:607 calls batches[0].RowCount() on nil -> panic