
    i
                        d Z ddlmZ ddlZdZ ej
                  dej                        Z ej
                  dej                        Z ej
                  dej                        Z	ddZ
dd	Zefdd
Zy)zZ
Shared validation for LLM-generated SQL (deep analysis tool + Pydantic reasoner output).
    )annotationsNd   z\b(MERGE|INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|TRUNCATE|GRANT|REVOKE|EXEC|EXECUTE|OPENROWSET|BULK\s+INSERT|WAITFOR|SHUTDOWN|BACKUP|RESTORE|DBCC|KILL)\bz(\bSELECT\b[\s\S]*?\bINTO\s+(?:#|\[|@|\w)zX;\s*\b(WITH|SELECT|INSERT|UPDATE|DELETE|MERGE|CREATE|DROP|ALTER|TRUNCATE|EXEC|EXECUTE)\bc                   | yt        |       j                         }|j                  d      r%|dd j                         }|j                  d      r%|j	                         j	                  d      j	                         }|S )zOStrip whitespace, leading batch semicolons, and trailing statement terminators.N ;   )strstrip
startswithlstriprstrip)queryss     G/var/www/html/userprofiledev.eatanceapp.com/deep_analysis/sql_safety.pynormalize_llm_sqlr   #   sk    }E
A
,,s
abELLN ,,s
	
#%%'AH    c                b   | t        |       j                         syt        |       }|syt        j	                  |      ryt
        j	                  |      ryt        j	                  |      ry|j                         }|j                         }|j                  d      s|j                  d      syy)	zl
    Return an error message if ``query`` is not allowed for the read-only tool.
    Return None if OK.
    NzQuery is empty.zJOnly one SQL statement is allowed (no extra statements after a semicolon).zVQuery contains forbidden SQL; only read-only SELECT (optionally with WITH) is allowed.zSELECT INTO is not allowed.SELECTWITHz+Query must begin with SELECT or WITH (CTE).)
r	   r
   r   _MULTI_STMTsearch
_FORBIDDEN_SELECT_INTOr   upperr   )r   qleadlus       r   validate_llm_sqlr   .   s    
 }CJ,,. % A ![g1,88:D	BMM(#r}}V'<<r   c                    t        |       }|j                         j                         }|j                  d      rd| S d| d| dS )uH  
    Limit rows for plain ``SELECT`` by wrapping in ``SELECT TOP (n) * FROM ( … )``.

    ``WITH`` (CTE) queries cannot be placed inside that subquery in SQL Server
    ("Incorrect syntax near 'WITH'"); those are returned unchanged (leading ``;``
    for batch safety). Callers should cap result rows in application code.
    r   r   zSELECT TOP (z) * FROM (
z
) AS _eatance_sub)r   r   r   r   )r   ninnerr   s       r   mssql_wrap_top_subqueryr"   E   sP     e$E				B	}}V5'{!L/BCCr   )r   r	   returnr	   )r   r	   r#   z
str | None)r   r	   r    intr#   r	   )__doc__
__future__r   reMAX_SQL_TOOL_ROWScompile
IGNORECASEr   r   r   r   r   r"    r   r   <module>r,      s    # 	  RZZ
 MM
 rzz/MM bjj_MM. 2C Dr   