<?php
declare(strict_types=1);
$root=$argv[1]??'';$module=$argv[2]??'';$modelFile=$argv[3]??'';if(!in_array($module,['store','terminal'],true))exit(78);
function getStoreId():int{return 2147001111;}
function app_name():string{return 'store';}
require $root.'/vendor/autoload.php';spl_autoload_register(static function($class)use($root){foreach(['app\\'=>'app/','cores\\'=>'cores/'] as $prefix=>$dir)if(strpos($class,$prefix)===0){$f=$root.'/'.$dir.str_replace('\\','/',substr($class,strlen($prefix))).'.php';if(is_file($f))require $f;}},true,true);
require $root.'/app/common/database/DmBuilder.php';require $modelFile;
class CommentSqlCapture extends \think\db\connector\Mysql{
 public array $sql=[];public array $values=[];
 public function connect(array $config=[],$linkNum=0,$autoConnection=false):\PDO{throw new RuntimeException('Compiler must not open PDO');}
 public function getFields(string $tableName):array{$r=[];foreach(['comment_id','store_id','user_id','goods_id','order_id','order_goods_id','score','status','sort','create_time','is_delete','content','goods_name','goods_no','order_no'] as $k)$r[$k]=['name'=>$k,'type'=>in_array($k,['content','goods_name','goods_no','order_no'],true)?'text':'int','primary'=>$k==='comment_id','autoinc'=>false];return $r;}
 public function value(\think\db\BaseQuery $query,string $field,$default=null,bool $one=true){$options=$query->parseOptions();$old=$options['field']??null;$query->setOption('field',(array)$field);$this->sql['count']=$this->getBuilder()->select($query,$one);$this->values['count']=array_map(static function($b){return $b[0];},$query->getBind(false));if($old!==null)$query->setOption('field',$old);else $query->removeOption('field');return 3;}
 public function select(\think\db\BaseQuery $query):array{$query->parseOptions();$this->sql['list']=$this->getBuilder()->select($query);$this->values['list']=array_map(static function($b){return $b[0];},$query->getBind(false));return [];}
}
$literal="comment.order 中文' \\";$assertions=0;$output=[];
foreach(['mysql'=>\think\db\builder\Mysql::class,'dm'=>\app\common\database\DmBuilder::class] as $dialect=>$builder){\cores\BaseModel::$storeId=2147001111;$db=new \think\DbManager();$db->setConfig(['default'=>'mysql','connections'=>['mysql'=>['type'=>'\\'.CommentSqlCapture::class,'builder'=>$builder,'prefix'=>'yoshop_','fields_strict'=>false]]]);$class='app\\'.$module.'\\model\\Comment';$model=new $class;$model->getList(['goodsName'=>$literal,'orderNo'=>$literal,'userId'=>987,'score'=>20,'status'=>0]);$cap=$db->connect('mysql');foreach(['count','list'] as $kind){$sql=$cap->sql[$kind];$values=$cap->values[$kind];$checks=['safe_alias'=>preg_match('/\byoshop_comment\b[^,]*?\bcm\b/',str_replace('`','',$sql))===1,'no_old_qualifier'=>strpos(str_replace('`','',$sql),'comment.')===false,'tenant_bind'=>in_array(2147001111,$values,true)||in_array('2147001111',$values,true),'literal_bind_unchanged'=>count(array_filter($values,static function($v)use($literal){return $v==='%'.$literal.'%';}))>=3,'joins'=>substr_count($sql,'INNER JOIN')===3,'safe_join_aliases'=>strpos(str_replace('`','',$sql),'yoshop_order co ON co.order_id')!==false&&strpos(str_replace('`','',$sql),'yoshop_user cu ON cu.user_id')!==false,'no_reserved_prefix'=>!preg_match('/\b(?:comment|order|user)\./',str_replace('`','',$sql)),'literal_not_in_sql'=>strpos($sql,$literal)===false,'score_filter'=>strpos($sql,'score')!==false,'status_filter'=>strpos($sql,'status')!==false];if($kind==='list'){$checks['ordered']=strpos($sql,'sort')!==false&&strpos($sql,'DESC')!==false;$checks['selected_cm']=strpos(str_replace('`','',$sql),'cm.*')!==false;}foreach($checks as $name=>$ok){$assertions++;if(!$ok)throw new RuntimeException($dialect.' '.$kind.' '.$name);}$output[$dialect][$kind]=['sql'=>$sql,'bind_values'=>$values];}}
echo json_encode(['module'=>$module,'assertions'=>$assertions,'SQL_DML'=>0,'PDO_opens'=>0,'output'=>$output],JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES),"\n";
