<?php
$lane=getenv('SS_LANE');$root=getenv('SS_ROOT');$cfg=(static function($file){return require $file;})($root.'/application/database.php');
if($lane==='B'){$local=require '/workspace/zhct/zhctproject/store/application/config/local/database.php';foreach(['hostname','database','username','password']as $key)if((string)$cfg[$key]!==$local[$key])throw new RuntimeException('Not code local');$dsn='mysql:host='.$cfg['hostname'].';port='.($cfg['hostport']?:3306).';dbname='.$cfg['database'].';charset=utf8mb4';}
else{if($cfg['hostname']!=='127.0.0.1'||(string)$cfg['hostport']!=='5237'||$cfg['database']!=='ZHCT_APP')throw new RuntimeException('Not nonprod5237/ZHCT_APP');$dsn='dm:host=127.0.0.1;port=5237;schema=ZHCT_APP';}
$db=new PDO($dsn,$cfg['username'],$cfg['password'],[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_CASE=>PDO::CASE_LOWER,PDO::ATTR_STRINGIFY_FETCHES=>false,PDO::ATTR_EMULATE_PREPARES=>false]);$journal=[];
$q=static function($sql,$args=[])use($db,&$journal){if(!preg_match('/^SELECT\b/i',$sql))throw new RuntimeException('SELECT only');$item=['SQL'=>$sql,'bindings'=>$args];try{$s=$db->prepare($sql);$s->execute($args);$rows=$s->fetchAll(PDO::FETCH_ASSOC);if(count($rows)>1000)throw new RuntimeException('Metadata/aggregate cap1000');foreach($rows as &$row){$row=array_change_key_case($row,CASE_LOWER);foreach($row as &$v)if(is_resource($v))$v=stream_get_contents($v);unset($v);}unset($row);$item['ok']=true;$journal[]=$item;return $rows;}catch(Throwable $e){$item['error']=$e->getMessage();$journal[]=$item;return ['read_error'=>$e->getMessage()];}};

$out=['lane'=>$lane,'DML'=>0,'DDL'=>0,'HTTP'=>0,'tests'=>[]];
if($lane==='C'){
 $tests=[
 'case_flag'=>"SELECT SF_GET_CASE_SENSITIVE_FLAG() AS FLAG FROM DUAL",
 'binary_case'=>"SELECT CASE WHEN BINARY('A')=BINARY('a') THEN 1 ELSE 0 END AS EQ FROM DUAL",
 'nlssort_case'=>"SELECT CASE WHEN NLSSORT('A','NLS_SORT = BINARY')=NLSSORT('a','NLS_SORT = BINARY') THEN 1 ELSE 0 END AS EQ FROM DUAL",
 'nlssort_tail'=>"SELECT CASE WHEN NLSSORT('A','NLS_SORT = BINARY')=NLSSORT('A ','NLS_SORT = BINARY') THEN 1 ELSE 0 END AS EQ FROM DUAL",
 'hex_pad_key'=>"SELECT CASE WHEN NVL(RAWTOHEX(CHARTOBIN(RTRIM('A',' '))),'#')=NVL(RAWTOHEX(CHARTOBIN(RTRIM('A ',' '))),'#') THEN 1 ELSE 0 END AS TAIL_EQ,CASE WHEN NVL(RAWTOHEX(CHARTOBIN(RTRIM('A',' '))),'#')=NVL(RAWTOHEX(CHARTOBIN(RTRIM('a',' '))),'#') THEN 1 ELSE 0 END AS CASE_EQ FROM DUAL",
 'clob_case'=>"SELECT DBMS_LOB.COMPARE(TO_CLOB('A'),TO_CLOB('a')) AS CMP FROM DUAL",
 'clob_tail'=>"SELECT DBMS_LOB.COMPARE(TO_CLOB('A'),TO_CLOB('A ')) AS CMP FROM DUAL",
 'clob_empty'=>"SELECT DBMS_LOB.GETLENGTH(TO_CLOB('')) AS EMPTY_LENGTH,DBMS_LOB.GETLENGTH(TO_CLOB(NULL)) AS NULL_LENGTH,CASE WHEN TO_CLOB('') IS NULL THEN 1 ELSE 0 END AS EMPTY_IS_NULL FROM DUAL",
 'char_padding'=>"SELECT CAST('A' AS CHAR(36)) AS CHAR_VALUE,LENGTH(CAST('A' AS CHAR(36))) AS CHAR_LENGTH,LENGTHB(CAST('A' AS CHAR(36))) AS CHAR_BYTES,CAST('' AS CHAR(32)) AS EMPTY_VALUE,LENGTH(CAST('' AS CHAR(32))) AS EMPTY_CHAR_LENGTH FROM DUAL",
 'collate_expression'=>"SELECT CASE WHEN 'A' COLLATE utf8mb4_bin = 'a' COLLATE utf8mb4_bin THEN 1 ELSE 0 END AS EQ FROM DUAL"
 ];
 $long=implode(' || ',array_fill(0,17,"TO_CLOB(RPAD('A',4000,'A'))"));
 $tests['clob_long_last_case']="SELECT DBMS_LOB.GETLENGTH(".$long." || TO_CLOB('A')) AS LOB_LENGTH,DBMS_LOB.COMPARE(".$long." || TO_CLOB('A'),".$long." || TO_CLOB('a')) AS CMP FROM DUAL";
 foreach($tests as $name=>$sql)$out['tests'][$name]=$q($sql);
 $out['lob_original_aggregate']=$q("SELECT COUNT(*) AS TOTAL,SUM(CASE WHEN SPORT_EVENT_UUID IS NULL THEN 1 ELSE 0 END) AS NULL_COUNT,MAX(DBMS_LOB.GETLENGTH(SPORT_EVENT_UUID)) AS MAX_CHARS,MAX(LENGTHB(SPORT_EVENT_UUID)) AS MAX_BYTES FROM YDY_STAFF");
}else{
 $out['lob_original_aggregate']=$q("SELECT COUNT(*) AS TOTAL,SUM(CASE WHEN SPORT_EVENT_UUID IS NULL THEN 1 ELSE 0 END) AS NULL_COUNT,MAX(CHAR_LENGTH(SPORT_EVENT_UUID)) AS MAX_CHARS,MAX(OCTET_LENGTH(SPORT_EVENT_UUID)) AS MAX_BYTES FROM ydy_staff");
 $out['tests']['char_padding']=$q("SELECT CAST('A' AS CHAR(36)) AS CHAR_VALUE,CHAR_LENGTH(CAST('A' AS CHAR(36))) AS CHAR_LENGTH,CAST('' AS CHAR(32)) AS EMPTY_VALUE");
}
foreach(['0','9007199254740991','9007199254740993','9223372036854775807','18446744073709551615']as $value){
 $number=$lane==='B'?'CAST('.$value.' AS UNSIGNED)':'CAST('.$value.' AS DECIMAL(20,0))';
 $row=$q('SELECT '.$number.' AS NATIVE_VALUE,CAST('.$number.' AS '.($lane==='B'?'CHAR':'VARCHAR(40)').') AS EXACT_VALUE'.($lane==='B'?'':' FROM DUAL'));
 $out['tests']['uint64_'.$value]=['native'=>$row,'php_type'=>isset($row[0])?gettype($row[0]['native_value']):null];
}
$out['journal']=$journal;
echo json_encode($out,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION),"\n";

