Files
ai-g3sb-backman2.0/backend/utils/__pycache__/sql_parser.cpython-312.pyc
T

142 lines
14 KiB
Plaintext
Raw Normal View History

2026-04-10 16:52:07 +08:00
Ë
K¦ØiÄ)ã óî—dZddlZddlZddlmZmZmZmZddlZddlm Z m
Z
m Z ddl m
Z
ddlmZmZej"e«Zddeded eeeeffd
„Zddeded eefd „Zd e j0d eeeffd
„Zddeded eeeeffd„Z ddede
ded eeeeffd„Zded efd„Zdeded efd„Zddededed efd„Zddeded efd„Z ddeded efd„Z!ddeded efd„Z"ddeded eeeffd„Z#y)u/
SQL 解�与验�工具(基于 sqlglot)
éN)ÚListÚTupleÚOptionalÚDict)ÚexpÚ parse_oneÚ
ParseError)Ú
SchemaManager)ÚTableÚColumnÚsqlÚdialectÚreturncó°—g} t||¬«}|€|jd«d|fStjtjtj
tj tjg}dD]2}tt|«sŒ|jtt|««Œ4t|t|««s*t|«j}|jd|›d�«dgfS#t$r+}|jd t|«›�«d|fcYd}~Sd}~wt $r+}|jd
t|«›�«d|fcYd}~Sd}~wwxYw) u›
验�SQL语法是�正确
Args:
sql: SQL语�
dialect: SQL方言
Returns:
(是�有效, 错误信�列表)
©rNuSQLè§£æž�返回空结果F)ÚShowÚDescribeÚExplainué�žæŸ¥è¯¢æ“�作(u$),å�ªå…�许SELECTç­‰å�ªè¯»è¯­å�¥TuSQL语法错误: uè§£æž�异常: )rÚappendrÚSelectÚUnionÚ IntersectÚExceptÚWithÚhasattrÚgetattrÚ
isinstanceÚtupleÚtypeÚ__name__r ÚstrÚ Exception)r
rÚerrorsÚparsedÚ readable_opsÚop_nameÚop_typeÚes úMC:\Users\24019\Desktop\backman-camel\text2sql_agent_camel\utils\sql_parser.pyÚvalidate_sql_syntaxr*s!€ð€Fðä˜3¨Ô0ˆà ˆ>Ø �M‰MÐ4Ô 5ؘ&�=Ð ôŸ
™
¤C§I¡I¬s¯}©}¼c¿j¹jÌ#Ï(É(ÐSˆ ã6ˆGÜ”s˜GÕ$Ø×#Ñ#¤G¬C°Ó$9Õ:ð7ô˜&¤%¨ Ó"5Ô6ܘ6“l×+Ñ+ˆGØ �M‰MÐ.¨w¨iÐ7[Ð\Ô ]à�Rˆxˆøä òØ�
‰
Ð)¬#¨a«&¨Ð2Ô3Ø�fˆ}ÕûÜ òØ�
‰
˜¤s¨1£v hÐ/Ô0Ø�fˆ}Õûðús<„#C/¨A"C/ A#C/Ã/ EÃ8 DÄEÄ EÄ* EÅ
EÅEcó0— t||¬«}g}|j«D]B}t|tj«sŒ|j
}|sŒ-||vsŒ2|j
|«ŒD|S#t$r$}tjd|›�«gcYd}~Sd}~wwxYw)u‘
从SQL中��所有表�
Args:
sql: SQL语�
dialect: SQL方言
Returns:
表�列表(去�)
ru��表�失败: N)
rÚwalkrrr Únamerr"ÚloggerÚwarning)r
rr$ÚtablesÚnodeÚ
table_namer(s r)Úextract_tables_from_sqlr3<s‡€ðܘ3¨Ô0ˆØˆð—K‘K–MˆDܘ$¤§ ¡ Õ*Ø!ŸY™Y�
Ú *°FÒ":Ø—M‘M *Õ-ð "ð ˆ
øÜ òÜ�‰Ð-¨a¨SÐ1Ô2Ø� ûðús.‚<A(¿A(ÁA(ÁA(Á( BÁ1BÂ
BÂBr$cóö—i}|j«D]c}t|tj«sŒ|j}|sŒ-|||<|j
j
d«}|€ŒP|j}|sŒ_|||<Œe|S)u¡
从已解�的 AST 构建「别�/表� -> 物�表��映射。
FROM T a 时 a -> T,且 T -> T,便于将 a.col 解�到表 T 的列。
Úalias)r,rrr r-ÚargsÚget)r$Ú alias_mapr1ÚphysicalÚtaliasÚanames r)Úbuild_table_alias_mapr<Xsy€ð !#€IØ— ‘ –
ˆÜ˜$¤§ ¡ Ô*Ø Ø—9‘9ˆÙØ Ø&ˆ �(ÑØ—‘—‘˜wÓ'ˆØ Ñ Ø—K‘KˆEÚØ#+� ˜%Ò ðð ÐócóH—g} t||¬«}|j«D]N}t|tj«sŒ|j
}|j }|sŒ9|sŒ<|j||f«ŒP|S#t$r$}tjd|›�«gcYd}~Sd}~wwxYw)u°
从SQL中��所有字段引用(表.字段)
Args:
sql: SQL语�
dialect: SQL方言
Returns:
[(表�, 字段�), ...] 列表
ruæ��å�–字段失败: N) rr,rrr Útabler-rr"r.r/)r
rÚcolumnsr$r1r2Úcol_namer(s r)Úextract_columns_from_sqlrBns�€ð€Gð
ܘ3¨Ô0ˆà—K‘K–MˆDܘ$¤§
¡
Õ+Ø!ŸZ™Z�
ØŸ9™9�Ú¢(Ø—N‘N J°Ð#9Õ:ð "ðˆøÜ òÜ�‰Ð-¨a¨SÐ1Ô2Ø� ûðús.„:A4¿A4ÁA4ÁA4Á4 B!Á=BÂB!ÂB!Úschema_managerc
ó^—g} t||¬«}t |«}g}|j «D]B}t
|tj«sŒ|j} | sŒ-| |vsŒ2|j| «ŒDg}
|j «D]N}t
|tj«sŒ|j|j} } | sŒ9| sŒ<|
j| | f«ŒP|D])}
|j|
«rŒ|jd|
›d�«Œ+|
D]Œ\}}|j||«}|j|«}|s|jd|›d|›d �«ŒD|jD�cgc]}|j‘Œ}}||vsŒl|jd|›d|›d
|›d |dd ›d
� «ŒŽ |j!tj"«D]ü}|j$jd«}|sŒ!|j!tj&«D]º}|j(}|j*}||fD]™}t
|tj«sŒ|j}
|j}|j|
|
«}|j|«}|sŒ\||jD�cgc]}|j‘Œc}vsŒƒ|jd|
›d|›�«Œ›Œ¼Œþ t-|«dk(|fS#t$r&}tjd|›�«dgfcYd}~Sd}~wwxYwcc}wcc}w#t$r"}tjd|›�«Yd}~Œrd}~wwxYw)uN
验�SQL与Schema的一致性
检查:
1. 所有表�存在于Schema
2. 所有字段�属于对应的表
3. JOIN�件字段存在且类型兼容
Args:
sql: SQL语�
schema_manager: Schema管�器
dialect: SQL方言
Returns:
(是�一致, 错误信�列表)
ru/Schema一致性检查跳过(解æž�失败): TNu表ä¸�存在: 'Ú'u字段ä¸�存在: 'Ú.u:'(无法将表引用解æž�到已加载Schema中的表)u '(表 'u' å�¯ç”¨å­—段: éu...)ÚonuJOINæ�¡ä»¶å­—段ä¸�存在: uJOINæ�¡ä»¶æ£€æŸ¥å¼‚常: r)rr"r.Údebugr<r,rrr r-rr r?Ú get_tabler7r@Úfind_allÚJoinr6ÚEQÚleftÚrightÚlen)r
rCrr#r$r(r8Ú tables_usedr1ÚtnameÚ columns_usedÚtrefÚcnameÚtblÚtbl_namerAr9r?ÚcÚ col_namesÚjoinÚ on_conditionÚeqrNrOÚsideÚcols r)Úvalidate_schema_consistencyr_‹s€ð*€Fðܘ3¨Ô0ˆô
& fÓ-€Ià€KØ— ‘ –
ˆÜ �dœCŸI™IÕ &Ø—I‘IˆEÚ˜ kÒ1Ø×"Ñ" 5Õ)ð ð +-€LØ— ‘ –
ˆÜ �dœCŸJ™JÕ 'ØŸ*™* d§i¡i�%ˆDÚšØ×#Ñ# T¨5 MÕ2ð óˆØ×'Ñ'¨Õ,Ø �M‰M˜O¨C¨5°Ð2Õ 3ðó
+ш�(Ø—=‘= ¨8Ó4ˆØ×(Ñ(¨Ó2ˆÙØ �M‰MØ$ X J¨a°¨zð:LðMô
ð
Ø%*§]¢]Ó3¡] �Q—V“V ]ˆ Ð3Ø ˜9Ò $Ø �M‰MØ$ X J¨a°¨zð:Ø#˜*Ð$4°Y¸rÀ°]°OÀ6ðKõ
ð+ð"5Ø—O‘O¤C§H¡HÖ-ˆDàŸ9™9Ÿ=™=¨Ó.ˆLÚà&×/Ñ/´·±Ö7�BØŸ7™7�DØŸH™H�Eð"& u£
˜Ü% d¬C¯J©JÕ7Ø"&§*¡*˜CØ"&§)¡)˜CØ'0§}¡}°S¸#Ó'>˜HØ$2×$<Ñ$<¸XÓ$F˜EÚ$¨ÀUÇ]Â]Ó4SÁ]À°Q·V³VÀ]Ñ4SÒ)SØ &§
¡
Ð0KÈCÈ5ÐPQÐRUÐQVÐ.WÕ Xñ!.ñ 8ñ .ô* ˆv‹;˜!Ñ ˜VÐ #Ð#øôC òÜ� ‰ ÐFÀqÀcÐJÔKØ�Rˆx�ûðüòF4ùò25Tøä ò5Ü� ‰ Ð/°¨sÐ3×4Ñ4ûð5úsf„
KÅK7Æ?LÇALÈ2=LÉ0LÉ?K< ÊLÊLË K4ËK/Ë)K4Ë/K4Ë<LÌ L,Ì
L'Ì'L,cóü—|s|S|}tjdd|tj¬«}tjdd|tj¬«}tjdd|tj¬«}|S)u 
模型在 T-SQL 目标下�常输出 MySQL 函数;sqlglot 转写也�能��。
SQL Server 无 CURDATE()/NOW(),需替�为 GETDATE �。
z\bCURDATE\s*\(\s*\)zCAST(GETDATE() AS DATE)©Úflagsz\bCURRENT_DATE\bz\bNOW\s*\(\s*\)z GETDATE())ÚreÚsubÚ
IGNORECASE)r
Úouts r)Úrewrite_mysql_builtins_for_tsqlrgèso€ñ
؈
Ø
€CÜ
�&‰&ØØ!Ø Ü�m‰mô  €Cô
�&‰&ØØ!Ø Ü�m‰mô  €Cô
�&‰&Ð# [°#¼R¿]¹]Ô
K€CØ €Jr=cóV—|xsdj«}|s|S|dk(r t|«S|S)už
将模型输出的 SQL 规范为目标方言。
对于 T-SQL,主�进行 MySQL 函数替�(因为模型��能输出 CURDATE() 等)。
ÚÚtsql)Ústriprg)r
rs r)Únormalize_sql_for_dialectrls8€ð
Š9�"×
Ñ
Ó
€C٠؈
ð�&ÒÜ.¨sÓ3Ð3à €Jr=Úindentcó¦— t||¬«}|j|d|¬«S#t$r$}tj d|›�«|cYd}~Sd}~wwxYw)u«
格�化SQL(�读性)
Args:
sql: SQL语�