<?php
// Inputs injected only after Root-approved SQL SHA verification by schema-run.py.
$lane='C';$runtime='/tmp/cdx-store-category9-C.Hr1w83';
require $runtime.'/source.php';
$emit=static function($kind,$data){echo json_encode(['kind'=>$kind,'data'=>$data],JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION),"\n";flush();};
$meta=static function()use($q){
 $table='YDY_MATERIAL_CATEGORY';
 return [
 'columns'=>$q('SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID',[$table]),
 'indexes'=>$q('SELECT * FROM USER_INDEXES WHERE TABLE_NAME=? ORDER BY INDEX_NAME',[$table]),
 'index_columns'=>$q('SELECT * FROM USER_IND_COLUMNS WHERE TABLE_NAME=? ORDER BY INDEX_NAME,COLUMN_POSITION',[$table]),
 'constraints'=>$q('SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME=? ORDER BY CONSTRAINT_NAME',[$table]),
 'constraint_columns'=>$q('SELECT * FROM USER_CONS_COLUMNS WHERE TABLE_NAME=? ORDER BY CONSTRAINT_NAME,POSITION',[$table]),
 'triggers'=>$q('SELECT * FROM USER_TRIGGERS WHERE TABLE_NAME=?',[$table]),
 'schema_ddl'=>$q("SELECT DBMS_METADATA.GET_DDL('TABLE',?,'ZHCT_APP') AS DDL FROM DUAL",[$table])];
};
$mapped=static function($s){
 foreach($s['material_category']as &$row){
  $id=(string)$row['id'];
  $row['create_time']=substr($row['create_time'],0,19);
  $row['update_time']=['2'=>'2001-02-03 04:05:06','3'=>'2001-02-03 04:05:07','4'=>'2026-10-11 02:21:27','5'=>'2026-10-11 02:21:28','6'=>'2026-10-11 02:21:28'][$id];
 }unset($row);return $s;
};
$ddl=0;
try{
 $before=$source();$emit('business-before',$before);
 $check($before['material_category']===$expected['rows'],'All exact5 original same-C rows');
 $check(array_map('strval',array_column($before['material_category'],'id'))===['2','3','4','5','6'],'Exact own IDs');
 foreach($before['material_category']as $r)$check(preg_match('/\.0{1,6}$/D',$r['create_time'])===1,'All CREATE_TIME zero fractions');
 $metadata=$meta();$emit('metadata-before',$metadata);
 foreach(['columns','indexes','index_columns','constraints','constraint_columns','triggers']as $key)$check($metadata[$key]===$expected[$key],'Exact fresh metadata '.$key);
 $check($metadata['triggers']===[],'Business table triggers0');
 $collision=$q('SELECT * FROM USER_TRIGGERS WHERE TRIGGER_NAME=?',['TRG_YDY_MATERIAL_CATEGORY_UT']);$emit('trigger-collision-before',$collision);$check($collision===[],'Exact trigger collision0');
 $sourceHashes=[];foreach($expectedSources as $relative=>$hash){$actual=hash_file('sha256',$runtime.'/source/'.$relative);$check($actual===$hash,'Current source SHA '.$relative);$sourceHashes[$relative]=$actual;}$emit('source-sha-before',$sourceHashes);
 $allowed=$mapped($before);
 foreach($statements as $i=>$sql){
  $check($ddl===0||$i===1,'No unknown repeat');$ddl++;
  $emit('DDL-start',['step'=>$i+1,'SQL'=>$sql,'sha256'=>hash('sha256',$sql),'utc'=>gmdate('c')]);
  $stmt=$db->prepare($sql);$ok=$stmt->execute();$check($ok,'Approved DDL success');
  $emit('DDL-success',['step'=>$i+1,'rowCount'=>$stmt->rowCount()]);
  $after=$source();$afterMeta=$meta();$emit('business-after-step-'.($i+1),$after);$emit('metadata-after-step-'.($i+1),$afterMeta);
  $check($after===$allowed,'Only approved same-C time mappings/all other source exact');
  $newCols=$afterMeta['columns'];$oldCols=$metadata['columns'];
  foreach($oldCols as $n=>$old){
   $new=$newCols[$n];
   if(in_array($old['column_name'],['UPDATE_TIME','CREATE_TIME'],true)){
    $check($new['data_type']==='DATETIME'&&(int)$new['data_scale']===0&&$new['nullable']==='N','Target datetime0 NOTNULL');
    $check(preg_replace('/\s+/','',strtoupper($new['data_default']))===($old['column_name']==='UPDATE_TIME'?'CURRENT_TIMESTAMP(0)':"'2000-01-0100:00:00'"),'Target exact default');
    foreach(['data_scale','default_length','data_default']as $key){unset($old[$key],$new[$key]);}
   }
   $check($old===$new,'Only expected date column metadata differences');
  }
  foreach(['indexes','index_columns','constraints','constraint_columns']as $key)$check($afterMeta[$key]===$metadata[$key],'Original schema exact '.$key);
  if($i===0)$check($afterMeta['triggers']===[],'No trigger before CREATE');
  else{$check(count($afterMeta['triggers'])===1,'One own business trigger');$tr=$afterMeta['triggers'][0];$check($tr['trigger_name']==='TRG_YDY_MATERIAL_CATEGORY_UT'&&$tr['table_name']==='YDY_MATERIAL_CATEGORY'&&$tr['status']==='ENABLED','Exact enabled trigger');}
 }
 $objects=$q('SELECT OBJECT_NAME,OBJECT_TYPE,STATUS FROM USER_OBJECTS WHERE OBJECT_NAME=?',['TRG_YDY_MATERIAL_CATEGORY_UT']);$emit('trigger-object-final',$objects);
 $check(count($objects)===1&&$objects[0]['status']==='VALID','Trigger valid');
 $errors=$q('SELECT * FROM USER_ERRORS WHERE NAME=?',['TRG_YDY_MATERIAL_CATEGORY_UT']);$emit('trigger-errors-final',$errors);$check($errors===[],'No trigger compile errors');
 $ddlRead=$q("SELECT DBMS_METADATA.GET_DDL('TRIGGER',?,'ZHCT_APP') AS DDL FROM DUAL",['TRG_YDY_MATERIAL_CATEGORY_UT']);$emit('trigger-DDL-final',$ddlRead);
 $emit('summary',['passed'=>true,'DDL'=>$ddl,'DML'=>0,'HTTP'=>0,'approved_existing_time_mapping'=>true,'other_business_source_exact'=>true,'trigger_enabled_valid'=>true]);
}catch(Throwable $e){$emit('stopped',['class'=>get_class($e),'message'=>$e->getMessage(),'DDL_started'=>$ddl,'DML'=>0,'HTTP'=>0]);exit(1);}
