<?php
declare(strict_types=1);
$repo=$argv[1]??'/Users/wiscourper/Documents/workspace/zhct/zhctproject/ai_api';$candidate=$argv[2]??'';require $repo.'/vendor/autoload.php';if($candidate!=='')require $candidate;
$dm=new \app\common\database\Dm([]);$builder=new \app\common\database\DmBuilder($dm);$query=new \think\db\Query($dm);$n=0;
$same=static function($got,$want,string $message)use(&$n):void{if($got!==$want)throw new RuntimeException($message);$n++;};
foreach([['values','"VALUES"'],['VALUES','"VALUES"'],['h.values','h."VALUES"'],['yoshop_h5_setting.values','yoshop_h5_setting."VALUES"'],['pivot.values','"PIVOT"."VALUES"'],['value','value'],['values_json','values_json'],['"VALUES"','"VALUES"'],['key','key'],['describe','describe'],["COALESCE(values, '')","COALESCE(values, '')"]] as [$input,$want])foreach([true,false] as $strict)$same($builder->parseKey($query,$input,$strict),$want,'Exact structured VALUES key quoting '.$input);
$aliased=(new \think\db\Query($dm))->table('yoshop_h5_setting')->alias('h');$same($builder->parseKey($aliased,'yoshop_h5_setting.values'),'h."VALUES"','Alias resolution before quoting');
$data=['key'=>'basic','describe'=>'基础设置','values'=>'{"values":"中文\u0027quote\\\\path","enabled":false}','store_id'=>2147001421,'update_time'=>1791630000];$parse=new ReflectionMethod($builder,'parseData');$parse->setAccessible(true);$bind=['key'=>PDO::PARAM_STR,'describe'=>PDO::PARAM_STR,'values'=>PDO::PARAM_STR,'store_id'=>PDO::PARAM_INT,'update_time'=>PDO::PARAM_INT];$got=$parse->invoke($builder,$query,$data,array_keys($data),$bind);$same(array_keys($got),['key','describe','"VALUES"','store_id','update_time'],'Only confirmed structured field changed');$same(array_column(array_values($query->getBind()),0),array_values($data),'All bound business values unchanged');
foreach(['yoshop_h5_setting','yoshop_wxapp_setting'] as $table){$q=(new \think\db\Query($dm))->table($table)->strict(true)->setFieldType(['key'=>'varchar','describe'=>'varchar','values'=>'text','store_id'=>'int','update_time'=>'int'])->data($data);$q->setOption('extra','')->setOption('comment','');$sql=$builder->insert($q);$same(strpos($sql,'"VALUES"')!==false,true,'Actual portable INSERT quoted VALUES '.$table);$same(substr_count($sql,' VALUES '),1,'INSERT syntax VALUES keyword remains unquoted');}
$mysql=new \think\db\connector\Mysql(['type'=>'mysql']);$mb=new \think\db\builder\Mysql($mysql);$mq=new \think\db\Query($mysql);$same($mb->parseKey($mq,'values'),'`values`','Original MySQL builder untouched');echo 'CLIENT_SETTINGS_VALUES_CONTRACT_PASS '.$n,"\n";
