<?php
// $plan is injected by precision-run.py after its approved SHA check.
$runtime=$lane==='B'?'/tmp/cdx-store-category9-B.cVux2z':'/tmp/cdx-store-category9-C.Hr1w83';
require $runtime.'/source.php';
$reads=0;$dml=0;$ddl=0;$created=false;$base=null;
$emit=static function($kind,$data){echo json_encode(['kind'=>$kind,'data'=>$data],JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION),"\n";flush();};
$sq=static function($sql,$args=[])use($q,&$reads,$check){$reads++;$check($reads<=30,'Approved SELECT cap30');return $q($sql,$args);};
$business=static function()use($source,&$reads,$check){$reads+=9;$check($reads<=30,'Approved SELECT cap30');return $source();};
$spec=$plan[$lane];$table=$spec['table'];
$check($table===($lane==='B'?'cdx_matut261011_precision':'CDX_MATUT261011_PRECISION'),'Exact approved table');
$qualified=$lane==='B'?$table:'ZHCT_APP.'.$table;
$collision=static function()use($sq,$lane,$table){return $lane==='B'?$sq('SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?',[$table]):$sq('SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME=?',[$table]);};
$metadata=static function()use($sq,$lane,$table){return $lane==='B'?$sq('SELECT COLUMN_NAME,COLUMN_TYPE,DATETIME_PRECISION,IS_NULLABLE,COLUMN_DEFAULT,EXTRA FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$table]):$sq('SELECT COLUMN_NAME,DATA_TYPE,DATA_LENGTH,DATA_SCALE,NULLABLE,DATA_DEFAULT FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID',[$table]);};
$rows=static function()use($sq,$qualified){return $sq('SELECT * FROM '.$qualified.' ORDER BY ID');};
$clock=static function()use($sq,$lane){return $sq($lane==='B'?'SELECT CURRENT_TIMESTAMP(0) AS T':"SELECT CAST(CURRENT_TIMESTAMP(0) AS DATETIME(0)) AS T FROM DUAL")[0]['t'];};
$allowed=array_merge([$spec['create'],$spec['cleanup']],$spec['before_alter'],$spec['after_alter']);if($spec['alter'])$allowed[]=$spec['alter'];
$execute=static function($sql,$kind)use($db,$check,$allowed,$emit,$lane,&$dml,&$ddl){
 $check(in_array($sql,$allowed,true),'Exact approved SQL');
 if($kind==='DML'){$dml++;$check($dml<=6,'Approved DML cap6');}else{$ddl++;$check($ddl<=($lane==='B'?2:3),'Approved DDL cap');}
 $emit('execute-start',['SQL'=>$sql,'SQL_sha256'=>hash('sha256',$sql),'kind'=>$kind,'utc'=>gmdate('c')]);
 $stmt=$db->prepare($sql);$ok=$stmt->execute();$check($ok,'Execute success');
 $emit('execute-success',['SQL'=>$sql,'kind'=>$kind,'rowCount'=>$stmt->rowCount()]);
};
try{
 $base=$business();$emit('business-before',$base);
 $check($collision()===[],'Exact table collision0');$emit('collision-before',[]);
 $execute($spec['create'],'DDL');$created=true;$emit('created',['table'=>$table]);
 $metaBefore=$metadata();$emit('metadata-created',$metaBefore);$check(count($metaBefore)===3,'Exact3 columns');
 foreach($spec['before_alter']as $sql)$execute($sql,'DML');
 $seed=$rows();$emit('seed-before-alter',$seed);$check(count($seed)===3,'Exactly3 own seed rows');
 $expected=$lane==='B'?['2026-10-11 02:21:27','2026-10-11 02:21:28','2026-10-11 02:21:28']:['2026-10-11 02:21:27.272259','2026-10-11 02:21:27.822848','2026-10-11 02:21:28.384726'];
 foreach($seed as $i=>$row){$check((int)$row['id']===$i+1&&$row['update_time']===$expected[$i],'Exact seed stored timestamp');}
 if($spec['alter']){
  $execute($spec['alter'],'DDL');$altered=$rows();$emit('seed-after-alter',$altered);
  $check(count($altered)===3,'ALTER keeps own3');
  foreach($altered as $i=>$row){$copy=$row;$copy['update_time']=$seed[$i]['update_time'];$check($copy===$seed[$i],'ALTER only update_time');$check($row['update_time']===['2026-10-11 02:21:27','2026-10-11 02:21:28','2026-10-11 02:21:28'][$i],'ALTER precision expected rounding');}
 }
 $metaAfter=$spec['alter']?$metadata():$metaBefore;$emit('metadata-after-alter',$metaAfter);
 $timeColumn=$metaAfter[2];$check(($lane==='B'?(int)$timeColumn['datetime_precision']:(int)$timeColumn['data_scale'])===0,'Stored fsp0');
 $check($lane==='B'?strtolower($timeColumn['extra'])==='on update current_timestamp':preg_replace('/\s+/','',strtoupper($timeColumn['data_default']))==='CURRENT_TIMESTAMP(0)','Default/ONUPDATE metadata');
 $beforeClock=$clock();
 foreach($spec['after_alter']as $sql)$execute($sql,'DML');
 $afterClock=$clock();$final=$rows();$emit('rows-final',['rows'=>$final,'clock_before'=>$beforeClock,'clock_after'=>$afterClock]);
 $check(count($final)===6,'Exactly6 own rows');
 foreach($final as $i=>$row){$check((int)$row['id']===$i+1&&$row['name']==='CDXMATUT261011-'.['P1','P2','L','DEFAULT','LOW','HIGH'][$i],'Own marker/id exact');$check(preg_match('/^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d$/D',$row['update_time'])===1,'Stored seconds without fraction');}
 $check($final[3]['update_time']>=$beforeClock&&$final[3]['update_time']<=$afterClock,'Default INSERT in local clock range');
 $check($final[4]['update_time']==='2001-01-01 01:01:01'&&$final[5]['update_time']==='2001-01-01 01:01:02','Explicit INSERT fractional rounding');
 $check($metadata()===$metaAfter,'Exact own schema before DROP');
 $check($created,'Own creation journal');$execute($spec['cleanup'],'DDL');$created=false;
 $check($collision()===[],'Own table0 after DROP');$emit('collision-after',[]);
 $businessFinal=$business();$emit('business-after',$businessFinal);$check($businessFinal===$base,'All business source exact');
 $emit('summary',['lane'=>$lane,'passed'=>true,'HTTP'=>0,'DML'=>$dml,'DDL'=>$ddl,'SELECT'=>$reads,'objects_remaining'=>0,'business_source_exact'=>true]);
}catch(Throwable $e){$emit('stopped',['lane'=>$lane,'class'=>get_class($e),'message'=>$e->getMessage(),'DML'=>$dml,'DDL'=>$ddl,'SELECT'=>$reads,'created'=>$created]);exit(1);}
