o
    y¬´\íÓ ã                   @   st  d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 dd	lm
Z
 dd
lmZ ddlmZ ddlmZ ddlmZ eg d¢ƒZe dej¡Zdd„ eddƒD ƒ dg¡Ze dej¡Ze dej¡ZddddddœZi ejd“ejd“ejd“ejd “ejd!“ej d"“ej!d#“ej"d"“ej#d$“ej$d%“ej%d&“ej&d'“ej'd(“ej(d)“ej)d*“ej*d+“ej+d,“i ej,d-“ej-d.“ej.d/“ej/d0“ej0d1“ej1d2“ej2d3“ej3d4“ej4d5“ej5d6“ej6d7“ej7d8“ej8d9“ej9d:“ej:d;“ej;d<“ej<d=“¥ej=d>ej>d?ej?d@i¥Z@ejAdAejBdBejCdCejDdDejEdEejFdFejGdGejHdHejIdIejJdJejKdKejLdLejMdMejNdNiZOdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^œZPe
jQjRd_e
jQjSd`e
jQjTdae
jQjUdbe
jQjVdce
jQjWddiZXG dedf„ dfeYƒZZG dgdh„ dhe [ej\eY¡ƒZ]G didj„ djej^ƒZ_G dkdl„ dleZƒZ`G dmdn„ dne`ƒZaG dodp„ dpeZƒZbG dqdr„ dre]ƒZcG dsdt„ dtecƒZdG dudv„ dveYƒZedS )wa]  Base SQL and DDL compiler implementations.

Classes provided include:

:class:`.compiler.SQLCompiler` - renders SQL
strings

:class:`.compiler.DDLCompiler` - renders DDL
(data definition language) strings

:class:`.compiler.GenericTypeCompiler` - renders
type specification strings.

To generate user-defined SQL strings, see
:doc:`/ext/compiler`.

é    Né   )Úcrud)Úelements)Ú	functions)Ú	operators)Úschema)Ú
selectable)Úsqltypes)Úvisitorsé   )Úexc)Úutil)^ÚallÚanalyseÚanalyzeÚandÚanyÚarrayÚasÚascÚ
asymmetricÚauthorizationÚbetweenÚbinaryÚbothÚcaseÚcastÚcheckÚcollateÚcolumnÚ
constraintÚcreateÚcrossÚcurrent_dateÚcurrent_roleÚcurrent_timeÚcurrent_timestampÚcurrent_userÚdefaultÚ
deferrableÚdescÚdistinctÚdoÚelseÚendÚexceptÚfalseÚforÚforeignÚfreezeÚfromÚfullÚgrantÚgroupÚhavingÚilikeÚinÚ	initiallyÚinnerÚ	intersectÚintoÚisÚisnullÚjoinÚleadingÚleftÚlikeÚlimitÚ	localtimeÚlocaltimestampÚnaturalÚnewÚnotÚnotnullÚnullÚoffÚoffsetÚoldÚonÚonlyÚorÚorderÚouterÚoverlapsÚplacingÚprimaryÚ
referencesÚrightÚselectÚsession_userÚsetÚsimilarÚsomeÚ	symmetricÚtableÚthenÚtoÚtrailingÚtrueÚunionÚuniqueÚuserÚusingÚverboseÚwhenÚwherez^[A-Z0-9_$]+$c                 C   s   h | ]}t |ƒ’qS © )Ústr)Ú.0Úxrl   rl   úI/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/sql/compiler.pyÚ	<setcomp>�   ó    rq   é
   ú$z%(?<![:\w\$\x5c]):([\w\$]+)(?![:\w\$])z\x5c(:[\w\$]*)(?![:\w\$])z%%(%(name)s)sú?z%%sz:[_POSITION]z	:%(name)s)ÚpyformatÚqmarkÚformatÚnumericÚnamedz AND z OR z + z * z - z / ú % ú-z < z <= z != z > z >= z = z IS DISTINCT FROM z IS NOT DISTINCT FROM z || z MATCH z NOT MATCH z IN z NOT IN ú, z FROM ú AS z IS z IS NOT z	 COLLATE zEXISTS ú	DISTINCT zNOT zANY zALL z DESCz ASCz NULLS FIRSTz NULLS LASTzcoalesce%(expr)sÚCURRENT_DATEÚCURRENT_TIMEÚCURRENT_TIMESTAMPÚCURRENT_USERÚ	LOCALTIMEÚLOCALTIMESTAMPzrandom%(expr)sÚsysdateÚSESSION_USERÚUSERzCUBE%(expr)szROLLUP%(expr)szGROUPING SETS%(expr)sÚmonthÚdayÚyearÚsecondÚhourÚdoyÚminuteÚquarterÚdowÚweekÚepochÚmillisecondsÚmicrosecondsÚtimezone_hourÚtimezone_minute)r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   r—   ÚUNIONz	UNION ALLÚEXCEPTz
EXCEPT ALLÚ	INTERSECTzINTERSECT ALLc                   @   s�   e Zd ZdZdZe ¡ Z	 dde ¡ fdd„Ze 	dd¡dd„ ƒZ
d	d
„ Zedd„ ƒZdd„ Zdd„ Zddd„Zedd„ ƒZdd„ Zdd„ ZdS )ÚCompileda  Represent a compiled SQL or DDL expression.

    The ``__str__`` method of the ``Compiled`` object should produce
    the actual text of the statement.  ``Compiled`` objects are
    specific to their underlying database dialect, and also may
    or may not be specific to the columns referenced within a
    particular set of bind parameters.  In no case should the
    ``Compiled`` object be dependent on the actual values of those
    bind parameters, even though it may reference those values as
    defaults.
    Nc                 C   sj   || _ || _| j j| _|r| j |¡| _|dur3|| _|j| _| jr&|j| _	| j
| jfi |¤Ž| _dS dS )aq  Construct a new :class:`.Compiled` object.

        :param dialect: :class:`.Dialect` to compile against.

        :param statement: :class:`.ClauseElement` to be compiled.

        :param bind: Optional Engine or Connection to compile this
          statement against.

        :param schema_translate_map: dictionary of schema names to be
         translated when forming the resultant SQL

         .. versionadded:: 1.1

         .. seealso::

            :ref:`schema_translating`

        :param compile_kwargs: additional kwargs that will be
         passed to the initial call to :meth:`.Compiled.process`.


        N)ÚdialectÚbindÚidentifier_preparerÚpreparerÚ_with_schema_translateÚ	statementÚsupports_executionÚcan_executeÚ_execution_optionsÚexecution_optionsÚprocessÚstring)Úselfrœ   r¡   r�   Úschema_translate_mapÚcompile_kwargsrl   rl   rp   Ú__init__	  s    
ÿûzCompiled.__init__z0.7zÊThe :meth:`.Compiled.compile` method is deprecated and will be removed in a future release.   The :class:`.Compiled` object now runs its compilation within the constructor, and this method does nothing.c                 C   ó   dS )zDProduce the internal string representation of this element.
        Nrl   ©r¨   rl   rl   rp   Úcompile8  s   
zCompiled.compilec                 C   s    | j r
| | ||¡S t | j¡‚©N)r£   Ú_execute_compiledr   ÚObjectNotExecutableErrorr¡   )r¨   Ú
connectionÚmultiparamsÚparamsrl   rl   rp   Ú_execute_on_connectionD  s   zCompiled._execute_on_connectionc                 C   ó   t ƒ ‚)z�Return a Compiled that is capable of processing SQL expressions.

        If this compiler is one, it would likely just return 'self'.

        ©ÚNotImplementedErrorr­   rl   rl   rp   Úsql_compilerJ  ó   zCompiled.sql_compilerc                 K   ó   |j | fi |¤ŽS r¯   ©Ú_compiler_dispatch)r¨   ÚobjÚkwargsrl   rl   rp   r¦   T  ó   zCompiled.processc                 C   s
   | j pdS )z3Return the string text of the generated SQL or DDL.Ú )r§   r­   rl   rl   rp   Ú__str__W  ó   
zCompiled.__str__c                 C   r¶   )zâReturn the bind params for this compiled object.

        :param params: a dict of string/object pairs whose values will
                       override bind values compiled in to the
                       statement.
        r·   ©r¨   r´   rl   rl   rp   Úconstruct_params\  rº   zCompiled.construct_paramsc                 C   s   |   ¡ S )z0Return the bind params for this compiled object.©rÅ   r­   rl   rl   rp   r´   f  s   zCompiled.paramsc                 O   s*   | j }|du rtjddd�‚| | ||¡S )zExecute this compiled object.Nz>This Compiled object is not bound to any Engine or Connection.Ú2afi©Úcode)r�   r   ÚUnboundExecutionErrorr°   )r¨   r³   r´   Úerl   rl   rp   Úexecutek  s   ýzCompiled.executec                 O   s   | j |i |¤Ž ¡ S )zJExecute this compiled object and return the result's
        scalar value.)rÌ   Úscalar)r¨   r³   r´   rl   rl   rp   rÍ   w  s   zCompiled.scalarr¯   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú_cached_metadatar   Úimmutabledictr¥   r«   Ú
deprecatedr®   rµ   Úpropertyr¹   r¦   rÂ   rÅ   r´   rÌ   rÍ   rl   rl   rl   rp   r›   ó   s0    	
ú/þ

	


r›   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚTypeCompilerz2Produces DDL specification for TypeEngine objects.z	visit_\w+c                 C   s
   || _ d S r¯   )rœ   )r¨   rœ   rl   rl   rp   r«   ƒ  ó   
zTypeCompiler.__init__c                 K   r»   r¯   r¼   ©r¨   Útype_Úkwrl   rl   rp   r¦   †  rÀ   zTypeCompiler.processN)rÎ   rÏ   rÐ   rÑ   Úensure_kwargr«   r¦   rl   rl   rl   rp   rÖ   ~  s
    rÖ   c                   @   sB   e Zd ZdZdZdZddd„Zedd„ ƒZed	d
„ ƒZ	dd„ Z
dS )Ú_CompileLabelz;lightweight label object which acts as an expression.Label.Úlabel)ÚelementÚnamerl   c                 C   s   || _ || _|f| | _d S r¯   )rÞ   rß   Ú
_alt_names)r¨   Úcolrß   Ú	alt_namesrl   rl   rp   r«   ‘  s   z_CompileLabel.__init__c                 C   ó   | j jS r¯   )rÞ   Ú	proxy_setr­   rl   rl   rp   rä   –  ó   z_CompileLabel.proxy_setc                 C   rã   r¯   )rÞ   Útyper­   rl   rl   rp   ræ   š  rå   z_CompileLabel.typec                 K   ó   | S r¯   rl   )r¨   rÚ   rl   rl   rp   Ú
self_groupž  ó   z_CompileLabel.self_groupN)rl   )rÎ   rÏ   rÐ   rÑ   Ú__visit_name__Ú	__slots__r«   rÕ   rä   ræ   rè   rl   rl   rl   rp   rÜ   Š  s    


rÜ   c                   @   s8  e Zd ZdZeZeZd Z Z	Z
	 dZdZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ	 d ZZ	�d dd„Zedd	„ ƒZejd
d„ ƒZejdd„ ƒZdd„ Zej dd„ ƒZ!dd„ Z"edd„ ƒZ#�ddd„Z$edd„ ƒZ%e &d¡dd„ ƒZ'dd„ Z(�ddd „Z)	�dd!d"„Z*	�dd#d$„Z+				�dd%d&„Z,d'd(„ Z-	�dd)d*„Z.d+d,„ Z/d-d.„ Z0d/d0„ Z1d1d2„ Z2d3d4„ Z3d5d6„ Z4d7d8„ Z5	�dd9d:„Z6d;d<„ Z7d=d>„ Z8d?d@„ Z9dAdB„ Z:dCdD„ Z;dEdF„ Z<dGdH„ Z=dIdJ„ Z>dKdL„ Z?dMdN„ Z@dOdP„ ZAdQdR„ ZB�ddSdT„ZCdUdV„ ZDdWdX„ ZEdYdZ„ ZF	[�dd\d]„ZGd^d_„ ZHd`da„ ZIdbdc„ ZJddde„ ZKdfdg„ ZLdhdi„ ZMdjdk„ ZNdldm„ ZO	�d dndo„ZPdpdq„ ZQdrds„ ZRdtdu„ ZSdvdw„ ZT	�ddxdy„ZUdzd{„ ZVd|d}„ ZWej d~d„ ƒZXd€d�„ ZYd‚dƒ„ ZZd„d…„ Z[d†d‡„ Z\dˆd‰„ Z]dŠd‹„ Z^dŒd�„ Z_dŽd�„ Z`d�d‘„ Zad’d“„ Zbd”d•„ Zcd–d—„ Zd			�dd˜d™„Zedšd›„ Zfdœd�„ ZgdždŸ„ Zhd d¡„ Zid¢d£„ Zjd¤d¥„ Zk	�d d¦d§„Zl				�d	d¨d©„Zm				�d
dªd«„Znd¬d­„ Zo�dd®d¯„Zpd°d±„ Zqd²d³„ Zr		�dd´dµ„Zsd¶d·„ Ztd¸d¹„ Zudºd»„ Zvd¼d½„ Zwd¾d¿„ ZxdÀdÁ„ ZydÂdÃ„ Zze {dÄe|ƒ fdÅe|ƒ fg¡Z}�ddÆdÇ„Z~				[			�ddÈdÉ„ZdÊdË„ Z€dÌdÍ„ Z�dÎdÏ„ Z‚dÐdÑ„ ZƒdÒdÓ„ Z„dÔdÕ„ Z…dÖd×„ Z†dØdÙ„ Z‡dÚdÛ„ ZˆdÜdÝ„ Z‰dÞdß„ ZŠdàdá„ Z‹					�ddâdã„ZŒ�ddädå„Z�dædç„ ZŽ�ddèdé„Z�dêdë„ Z�dìdí„ Z‘dîdï„ Z’�ddðdñ„Z“ej dòdó„ ƒZ”dôdõ„ Z•död÷„ Z–�ddødù„Z—dúdû„ Z˜düdý„ Z™dþdÿ„ ZšdS (  ÚSQLCompilerzsDefault implementation of :class:`.Compiled`.

    Compiles :class:`.ClauseElement` objects into SQL strings.

    FNTrl   c                 K   sÞ   || _ |p
t|ddƒ| _i | _t ¡ | _g | _g | _|j	| _	| j	r*g | _
|jdk| _t|j | _d| _|jp8|j| _t | j¡| _i | _tj| ||fi |¤Ž | jsX| jsX| jr_|jr_|j| _| j	rk| jrm|  ¡  dS dS dS )a  Construct a new :class:`.SQLCompiler` object.

        :param dialect: :class:`.Dialect` to be used

        :param statement: :class:`.ClauseElement` to be compiled

        :param column_keys:  a list of column names to be compiled into an
         INSERT or UPDATE statement.

        :param inline: whether to generate INSERT statements as "inline", e.g.
         not formatted to return any generated defaults

        :param kwargs: additional keyword arguments to be consumed by the
         superclass.

        ÚinlineFry   N)Úcolumn_keysÚgetattrrí   Úbindsr   Úcolumn_dictÚ
bind_namesÚstackÚ_result_columnsÚ
positionalÚpositiontupÚ
paramstyleÚ_numeric_bindsÚBIND_TEMPLATESÚbindtemplateÚctesÚlabel_lengthÚmax_identifier_lengthÚPopulateDictÚ_process_anonÚanon_mapÚtruncated_namesr›   r«   ÚisinsertÚisupdateÚisdeleteÚ
_returningÚ	returningÚ_apply_numbered_params)r¨   rœ   r¡   rî   rí   r¿   rl   rl   rp   r«   ë  s:   

ÿÿÿÿþÿzSQLCompiler.__init__c                 C   s   t | j| j ƒS r¯   )ÚlistÚinsert_prefetchÚupdate_prefetchr­   rl   rl   rp   Úprefetch3  ó   zSQLCompiler.prefetchc                 C   s*   t  ¡ | _i | _d| _| jri | _dS dS )z’Initialize collections related to CTEs only if
        a CTE is located, to save on the overhead of
        these collections otherwise.

        FN)r   ÚOrderedDictrû   Úctes_by_nameÚctes_recursiverõ   Úcte_positionalr­   rl   rl   rp   Ú_init_cte_state7  s   

ÿzSQLCompiler._init_cte_statec              	   c   sŒ   � | j | j}}g d| _ | _z'| jr| jd }d|d< nd}| j | jfV  W |r.| d¡ ||| _ | _dS |r>| d¡ ||| _ | _w )z;special API to support the use case of 'nested result sets'FéÿÿÿÿTÚneed_result_map_for_nestedN)rô   Ú_ordered_columnsró   Úpop)r¨   Úresult_columnsÚordered_columnsÚentryrl   rl   rp   Ú_nested_resultE  s*   €þ


þþ
þzSQLCompiler._nested_resultc                    s(   t  d¡‰ t d‡ fdd„| j¡| _d S )Nr   z\[_POSITION\]c                    s   t t ˆ ¡ƒS r¯   )rm   r   Únext©Úm©Úposcountrl   rp   Ú<lambda>`  s    z4SQLCompiler._apply_numbered_params.<locals>.<lambda>)Ú	itertoolsÚcountÚreÚsubr§   r­   rl   r  rp   r  ]  s   

ÿz"SQLCompiler._apply_numbered_paramsc                    s"   t dd„ ‡ fdd„ˆ jD ƒD ƒƒS )Nc                 s   s$   � | ]\}}|d ur||fV  qd S r¯   rl   )rn   ÚkeyÚvaluerl   rl   rp   Ú	<genexpr>e  s   € ø÷z/SQLCompiler._bind_processors.<locals>.<genexpr>c                 3   s(   � | ]}ˆ j | |j ˆ j¡fV  qd S r¯   )rò   ræ   Ú_cached_bind_processorrœ   )rn   Ú	bindparamr­   rl   rp   r&  g  s   € ýþ
ÿ)Údictrò   r­   rl   r­   rp   Ú_bind_processorsc  s
   
ûþzSQLCompiler._bind_processorsc                 C   s   t | jƒdkS ©Nr   )Úlenró   r­   rl   rl   rp   Úis_subqueryq  ó   zSQLCompiler.is_subqueryc                 C   rç   r¯   rl   r­   rl   rl   rp   r¹   t  ó   zSQLCompiler.sql_compilerc                 C   s  |rTi }| j D ]J}| j | }|j|v r||j ||< q||v r&|| ||< q|rC|jrC|r9tjd|j|f dd�‚tjd|j dd�‚|jrL|j||< q|j||< q|S i }| j D ]3}|rx|jrx|rntjd|j|f dd�‚tjd|j dd�‚|jr„|j|| j | < qY|j|| j | < qY|S )z5return a dictionary of bind parameter keys and valuesz@A value is required for bind parameter %r, in parameter group %dÚcd3xrÈ   z)A value is required for bind parameter %r)rò   r$  Úrequiredr   ÚInvalidRequestErrorÚcallableÚeffective_valuer%  )r¨   r´   Ú_group_numberÚ_checkÚpdr(  rß   rl   rl   rp   rÅ   x  s\   



þüÿý

þüÿýzSQLCompiler.construct_paramsc                 C   s   | j dd�S )zoReturn the bind param dictionary embedded into this
        compiled object, for those values that are present.F)r6  rÆ   r­   rl   rl   rp   r´   °  s   zSQLCompiler.paramszsqlalchemy.engine.resultc                 C   s   |j  | j¡S )z(utility method used for unit tests only.)ÚResultMetaDataÚ_create_result_maprô   )r¨   Úresultrl   rl   rp   r9  ¶  s   zSQLCompiler._create_result_mapc                 C   r¬   )z´Called when a SELECT statement has no froms, and no FROM clause is
        to be appended.

        Gives Oracle a chance to tack on a ``FROM DUAL`` to the string output.

        rÁ   rl   r­   rl   rl   rp   Údefault_from»  s   zSQLCompiler.default_fromc                 K   s   d|j j| fi |¤Ž d S )Nú(ú)©rÞ   r½   )r¨   ÚgroupingÚasfromr¿   rl   rl   rp   Úvisit_groupingÄ  s   zSQLCompiler.visit_groupingc           
      K   s„   | j r6| jjr6| j d d }|j\}}}|r|}n|}|jj}	|	d ur6|	j|v r6|	 ||	j ¡r6|jj|d< | j|jfd|i|¤ŽS )Nr  r   Úrender_label_as_labelÚwithin_columns_clause)	ró   rœ   Úsupports_simple_order_by_labelÚ_label_resolve_dictrÞ   Ú_order_by_label_elementrß   Úshares_lineager¦   )
r¨   rÞ   rC  r¿   r   Ú	with_colsÚ
only_fromsÚ	only_colsÚresolve_dictÚorder_by_elemrl   rl   rp   Úvisit_label_referenceÇ  s0   
ÿÿþÿÿþýz!SQLCompiler.visit_label_referencec           	   	   K   sœ   | j s	|  |j¡S | j d d }|j\}}}z|r||j }n||j }W n ty>   t dt |j¡¡ |  |j¡ Y S w ||d< | j|fd|i|¤ŽS )Nr  r   z6Can't resolve label reference %r; converting to text()rB  rC  )	ró   r¦   Ú_text_clauserE  rÞ   ÚKeyErrorr   Úwarn_limitedÚellipses_string)	r¨   rÞ   rC  r¿   r   rH  rI  rJ  rá   rl   rl   rp   Úvisit_textual_label_referenceé  s0   
€
þúÿÿÿz)SQLCompiler.visit_textual_label_referencec           
      K   sÂ   |o| }||u }|s|rt |jtjƒr|  d|j¡}	n|j}	|rL|d ur3||	|j||	f|j |jƒ |jj| fdddœ|¤Žt	t
j  | j ||	¡ S |rU| j ||	¡S |jj| fddi|¤ŽS )NÚcolidentT)rC  Úwithin_label_clauserC  F)Ú
isinstancerß   r   Ú_truncated_labelÚ_truncated_identifierrà   ræ   rÞ   r½   Ú	OPERATORSr   Úas_rŸ   Úformat_label)
r¨   rÝ   Úadd_to_result_maprT  rC  rB  rÚ   Úrender_label_with_asÚrender_label_onlyÚ	labelnamerl   rl   rp   Úvisit_label  sJ   ÿüÿýüúùÿ
ÿÿÿzSQLCompiler.visit_labelc                 C   ó
   t  d¡‚)Nz:Cannot compile Column object until its 'name' is assigned.©r   ÚCompileError©r¨   r   rl   rl   rp   Ú_fallback_column_name5  ó   ÿz!SQLCompiler._fallback_column_namec                 K   sò   |j  }}|d u r|  |¡}|j}|st|tjƒr|  d|¡}|d ur/||||||jf|jƒ |r7|  	|¡}n| j
 |¡}|j}|d u sI|rI|jsK|S | j
 |¡}	|	r\| j
 |	¡d }
nd}
|j }t|tjƒrm|  d|¡}|
| j
 |¡ d | S )NrS  Ú.rÁ   Úalias)rß   rd  Ú
is_literalrU  r   rV  rW  r$  ræ   Úescape_literal_columnrŸ   Úquoter`   Únamed_with_columnÚschema_for_objectÚquote_schema)r¨   r   r[  Úinclude_tabler¿   rß   Ú	orig_namerh  r`   Úeffective_schemaÚschema_prefixÚ	tablenamerl   rl   rp   Úvisit_column:  s2   

ÿÿzSQLCompiler.visit_columnc                 K   s   | j  |j¡S r¯   )rŸ   Úformat_collationÚ	collation)r¨   rÞ   rÚ   rl   rl   rp   Úvisit_collation`  r.  zSQLCompiler.visit_collationc                 K   ó   |j S r¯   ©rß   )r¨   Ú
fromclauser¿   rl   rl   rp   Úvisit_fromclausec  ó   zSQLCompiler.visit_fromclausec                 K   rw  r¯   rx  )r¨   Úindexr¿   rl   rl   rp   Úvisit_indexf  r{  zSQLCompiler.visit_indexc                 K   s    ||d< | j jj|jfi |¤ŽS )NÚtype_expression)rœ   Útype_compilerr¦   ræ   )r¨   Ú
typeclauserÚ   rl   rl   rp   Úvisit_typeclausei  s   zSQLCompiler.visit_typeclausec                 C   ó   | j jr
| dd¡}|S ©Nú%ú%%©rŸ   Ú_double_percentsÚreplace©r¨   Útextrl   rl   rp   Úpost_process_textm  ó   zSQLCompiler.post_process_textc                 C   r‚  rƒ  r†  r‰  rl   rl   rp   ri  r  rŒ  z!SQLCompiler.escape_literal_columnc              	      s<   ‡ ‡‡fdd„}ˆj sdˆ_t dd„ t |ˆ ˆj¡¡¡S )Nc                    s>   |   d¡}|ˆjv rˆjˆj| fi ˆ ¤ŽS ˆj|fi ˆ ¤ŽS r+  )r7   Ú_bindparamsr¦   Úbindparam_string)r  rß   ©rÚ   r¨   Ú
textclauserl   rp   Údo_bindparamx  s   

z2SQLCompiler.visit_textclause.<locals>.do_bindparamTc                 S   s
   |   d¡S r+  )r7   r  rl   rl   rp   r  „  s   
 z.SQLCompiler.visit_textclause.<locals>.<lambda>)ró   ÚisplaintextÚBIND_PARAMS_ESCr#  ÚBIND_PARAMSr‹  rŠ  )r¨   r�  rÚ   r‘  rl   r�  rp   Úvisit_textclausew  s   ÿþzSQLCompiler.visit_textclausec                 K   s˜   | j  }|r	| jn| j d }|p|dko| dd¡p| dd¡}|r8|j | _| _|jD ]}	| j|	d| jd� q,| j|j	fi |¤Ž}
|rJ|rJd|
 }
|
S )	Nr  r   Úneed_result_map_for_compoundFr  T©rC  r[  ú(%s))
ró   Ú_default_stack_entryÚgetrõ   r  Ú_textual_ordered_columnsÚcolumn_argsr¦   Ú_add_to_result_maprÞ   )r¨   ÚtafÚcompound_indexr@  ÚparensrÚ   Útoplevelr  Úpopulate_result_mapÚcrŠ  rl   rl   rp   Úvisit_text_as_fromŠ  s,   
ý
ú	þ
ýzSQLCompiler.visit_text_as_fromc                 K   r¬   )NÚNULLrl   ©r¨   ÚexprrÚ   rl   rl   rp   Ú
visit_nullª  ré   zSQLCompiler.visit_nullc                 K   ó   | j jrdS dS )Nrd   Ú1©rœ   Úsupports_native_booleanr¦  rl   rl   rp   Ú
visit_true­  ó   zSQLCompiler.visit_truec                 K   r©  )Nr0   Ú0r«  r¦  rl   rl   rp   Úvisit_false³  r®  zSQLCompiler.visit_falsec                    sD   |j }|d u r
d}nt|j  }| dd„ ‡ ‡fdd„|jD ƒD ƒ¡S )Nú c                 s   s   � | ]}|r|V  qd S r¯   rl   ©rn   Úsrl   rl   rp   r&  ¿  s   € û
ÿz/SQLCompiler.visit_clauselist.<locals>.<genexpr>c                 3   s"   � | ]}|j ˆfi ˆ ¤ŽV  qd S r¯   r¼   ©rn   r£  ©rÚ   r¨   rl   rp   r&  Á  s   € 
ÿ)ÚoperatorrX  rA   Úclauses)r¨   Ú
clauselistrÚ   Úseprl   rµ  rp   Úvisit_clauselist¹  s   

ÿþzSQLCompiler.visit_clauselistc                 K   s¤   d}|j d ur||j j| fi |¤Žd 7 }|jD ]\}}|d|j| fi |¤Ž d |j| fi |¤Ž d 7 }q|jd urL|d|jj| fi |¤Ž d 7 }|d7 }|S )NzCASE r±  zWHEN z THEN zELSE ÚEND)r%  r½   ÚwhensÚelse_)r¨   Úclauser¿   ro   Úcondr:  rl   rl   rp   Ú
visit_caseÇ  s*   
ÿþýüÿ
ÿzSQLCompiler.visit_casec                 K   ó   |j j| fi |¤ŽS r¯   )Útyped_expressionr½   )r¨   Útype_coercerÚ   rl   rl   rp   Úvisit_type_coerceÚ  ó   zSQLCompiler.visit_type_coercec                 K   ó,   d|j j| fi |¤Ž|jj| fi |¤Žf S )NzCAST(%s AS %s))r¾  r½   r€  )r¨   r   r¿   rl   rl   rp   Ú
visit_castÝ  ó   þzSQLCompiler.visit_castc              	   K   s   d|d t ju r
dn2|d t ju rdn)|d dk r,d| jt  t|d ƒ¡fi |¤Žf nd| jt  |d ¡fi |¤Žf |d t ju rGdf S |d t ju rRdf S |d dk rmd| jt  t|d ƒ¡fi |¤Žf f S d| jt  |d ¡fi |¤Žf f S )	Nz	%s AND %sr   zUNBOUNDED PRECEDINGzCURRENT ROWz%s PRECEDINGz%s FOLLOWINGr   zUNBOUNDED FOLLOWING)r   ÚRANGE_UNBOUNDEDÚRANGE_CURRENTr¦   ÚliteralÚabs)r¨   Úrange_rÚ   rl   rl   rp   Ú_format_frame_clauseã  s6   ÿÿþ ÿÿÿöÿôþ ÿòÿïz SQLCompiler._format_frame_clausec                    s”   |j rdˆj|j fi ˆ ¤Ž }n|jr dˆj|jfi ˆ ¤Ž }nd }d|jjˆfi ˆ ¤Žd ‡ ‡fdd„d|jfd|jffD ƒ|rD|gng  ¡f S )	NzRANGE BETWEEN %szROWS BETWEEN %sz%s OVER (%s)r±  c                    s:   g | ]\}}|d urt |ƒrd||jˆfi ˆ ¤Žf ‘qS )Nz%s BY %s)r,  r½   )rn   Úwordr¾  ©r¿   r¨   rl   rp   Ú
<listcomp>	  s    úÿz*SQLCompiler.visit_over.<locals>.<listcomp>Ú	PARTITIONÚORDER)rÍ  rÎ  ÚrowsrÞ   r½   rA   Úpartition_byÚorder_by)r¨   Úoverr¿   rÍ  rl   rÐ  rp   Ú
visit_overú  s2   ÿ
ÿÿ
ÿþý	÷ÿþzSQLCompiler.visit_overc                 K   rÆ  )Nz%s WITHIN GROUP (ORDER BY %s))rÞ   r½   rÖ  )r¨   Úwithingroupr¿   rl   rl   rp   Úvisit_withingroup  rÈ  zSQLCompiler.visit_withingroupc                 K   rÆ  )Nz%s FILTER (WHERE %s))Úfuncr½   Ú	criterion)r¨   Ú
funcfilterr¿   rl   rl   rp   Úvisit_funcfilter  rÈ  zSQLCompiler.visit_funcfilterc                 K   s.   | j  |j|j¡}d||jj| fi |¤Žf S )NzEXTRACT(%s FROM %s))Úextract_maprš  Úfieldr§  r½   )r¨   Úextractr¿   rà  rl   rl   rp   Úvisit_extract"  s
   þzSQLCompiler.visit_extractc                 K   s†   |d ur||j |j d|jƒ t| d|j  ¡  d ƒ}|r#||fi |¤ŽS t |j|j d ¡}d t|j	ƒ|g ¡d| j
|fi |¤Ži S )Nrl   zvisit_%s_funcz%(expr)srf  r§  )rß   ræ   rï   ÚlowerÚ	FUNCTIONSrš  Ú	__class__rA   r  ÚpackagenamesÚfunction_argspec)r¨   rÛ  r[  r¿   Údisprß   rl   rl   rp   Úvisit_function)  s   ÿzSQLCompiler.visit_functionc                 K   s   |   |j¡S r¯   )Úvisit_sequenceÚsequence)r¨   Ú
next_valuerÚ   rl   rl   rp   Úvisit_next_value_func6  ó   z!SQLCompiler.visit_next_value_funcc                 K   s   t d| jj ƒ‚)Nz2Dialect '%s' does not support sequence increments.)r¸   rœ   rß   )r¨   rë  rÚ   rl   rl   rp   rê  9  s
   ÿÿzSQLCompiler.visit_sequencec                 K   rÁ  r¯   )Úclause_exprr½   )r¨   rÛ  r¿   rl   rl   rp   rç  ?  rÅ  zSQLCompiler.function_argspecr   c                    s,  ˆj  }|r	ˆjnˆj d }|p|dko| dd¡}ˆj  |d |d ||dœ¡ ˆj |j¡}	d|	 d  ‡ ‡‡fd	d
„t|jƒD ƒ¡}
|
ˆj	|fi t
ddˆ iˆ¤Ž¤Ž7 }
|
ˆj|fi ˆ¤Ž7 }
|
|jd usm|jd urvˆj|fi ˆ¤Žpwd7 }
ˆjr„|r„ˆ ¡ |
 }
ˆj  d¡ ˆ r”|r”d|
 d S |
S )Nr  r   r–  FÚcorrelate_fromsÚasfrom_froms)rð  rñ  r   r–  r±  c                 3   s.   � | ]\}}|j ˆfˆ d |dœˆ¤ŽV  qdS )F)r@  r   rŸ  Nr¼   )rn   Úir£  ©r@  r¿   r¨   rl   rp   r&  X  s   € ùÿüû
ÿz4SQLCompiler.visit_compound_select.<locals>.<genexpr>r@  rÁ   r<  r=  rl   )ró   r™  rš  ÚappendÚcompound_keywordsÚkeywordrA   Ú	enumerateÚselectsÚgroup_by_clauser)  Úorder_by_clauseÚ_limit_clauseÚ_offset_clauseÚlimit_clauserû   Ú_render_cte_clauser  )r¨   Úcsr@  r   rŸ  r¿   r¡  r  Úneed_result_maprö  rŠ  rl   ró  rp   Úvisit_compound_selectB  sB   
þüÿ	øÿ$ÿý
z!SQLCompiler.visit_compound_selectc                 C   s(   d|j ||r
d| ndf }t| |d ƒS )Nzvisit_%s_%s%sÚ_rÁ   )rÎ   rï   )r¨   Ú	operator_Ú
qualifier1Ú
qualifier2Úattrnamerl   rl   rp   Ú_get_operator_dispatchu  s   ýz"SQLCompiler._get_operator_dispatchc                 K   sª   |j r,|jrt d¡‚|  |j dd¡}|r|||j fi |¤ŽS | j|t|j  fi |¤ŽS |jrP|  |jdd¡}|rC|||jfi |¤ŽS | j|t|j fi |¤ŽS t d¡‚)NzFUnary expression does not support operator and modifier simultaneouslyÚunaryr¶  Úmodifierz,Unary expression has no operator or modifier)r¶  r	  r   rb  r  Ú _generate_generic_unary_operatorrX  Ú _generate_generic_unary_modifier)r¨   r  rÚ   rè  rl   rl   rp   Úvisit_unary}  s:   ÿÿ
ÿÿÿ
ÿÿÿzSQLCompiler.visit_unaryc                 K   s:   |j s| jjr| j|jfi |¤ŽS d| j|jfi |¤Ž S )Nz%s = 1©Ú_is_implicitly_booleanrœ   r¬  r¦   rÞ   ©r¨   rÞ   r¶  rÚ   rl   rl   rp   Úvisit_istrue_unary_operatorœ  s   ÿþz'SQLCompiler.visit_istrue_unary_operatorc                 K   s>   |j s| jjrd| j|jfi |¤Ž S d| j|jfi |¤Ž S )NúNOT %sz%s = 0r  r  rl   rl   rp   Úvisit_isfalse_unary_operator¥  s   ÿþz(SQLCompiler.visit_isfalse_unary_operatorc                 K   s   d| j |tjd� S )Nr  )Úoverride_operator)Úvisit_binaryr   Úmatch_op©r¨   r   r¶  rÚ   rl   rl   rp   Úvisit_notmatch_op_binary®  s   ÿz$SQLCompiler.visit_notmatch_op_binaryc                 C   s   t  d¡ d S )NzÀThe IN-predicate was invoked with an empty sequence. This results in a contradiction, which nonetheless can be expensive to evaluate.  Consider alternative strategies for improved performance.)r   Úwarnr­   rl   rl   rp   Ú_emit_empty_in_warning³  s   ÿz"SQLCompiler._emit_empty_in_warningc                 K   s.   | j jrdS | j jr|  ¡  |  |j|jk¡S )Nz1 != 1©rœ   Ú_use_static_inÚ_warn_on_empty_inr  r¦   rC   r  rl   rl   rp   Úvisit_empty_in_op_binary¼  ó
   z$SQLCompiler.visit_empty_in_op_binaryc                 K   s.   | j jrdS | j jr|  ¡  |  |j|jk¡S )Nz1 = 1r  r  rl   rl   rp   Úvisit_empty_notin_op_binaryÄ  r  z'SQLCompiler.visit_empty_notin_op_binaryc                 K   s”   | j rt|jtjƒrt|jtjƒrd|d< |p|j}|  |dd ¡}|r,|||fi |¤ŽS zt| }W n t	y?   t
 | |¡‚w | j||fi |¤ŽS )NTÚliteral_bindsr   )Úansi_bind_rulesrU  rC   r   ÚBindParameterrY   r¶  r  rX  rO  r   ÚUnsupportedCompilationErrorÚ_generate_generic_binary)r¨   r   r  Úeager_groupingrÚ   r  rè  Úopstringrl   rl   rp   r  Ì  s"   ÿþý
ÿzSQLCompiler.visit_binaryc                 K   s`   | j jr| j|jfi |¤Žd | j|jfi |¤Ž S | j|jfi |¤Žd | j|jfi |¤Ž S )Nz %% r{   )rŸ   r‡  r¦   rC   rY   r  rl   rl   rp   Úvisit_mod_binaryä  s   ÿþÿÿþÿzSQLCompiler.visit_mod_binaryc                 K   s(   |j |d< | j|d|j d fi |¤ŽS )Nr%  r±  )r%  r$  r&  r  rl   rl   rp   Úvisit_custom_op_binaryò  s   
ÿÿz"SQLCompiler.visit_custom_op_binaryc                 K   s   | j ||jd fi |¤ŽS ©Nr±  )r
  r&  r  rl   rl   rp   Úvisit_custom_op_unary_operatorø  ó
   
ÿÿz*SQLCompiler.visit_custom_op_unary_operatorc                 K   s   | j |d|j fi |¤ŽS r)  )r  r&  r  rl   rl   rp   Úvisit_custom_op_unary_modifierý  r+  z*SQLCompiler.visit_custom_op_unary_modifierc                 K   s\   |  dd¡}d|d< |jj| fd|i|¤Ž| |jj| fd|i|¤Ž }|r,|r,d| }|S )NÚ
_in_binaryFTr%  r˜  )rš  rC   r½   rY   )r¨   r   r&  r%  rÚ   r-  rŠ  rl   rl   rp   r$    s.   ÿÿÿýÿÿÿüÿ
z$SQLCompiler._generate_generic_binaryc                 K   s   ||j j| fi |¤Ž S r¯   r>  ©r¨   r  r&  rÚ   rl   rl   rp   r
    ó   z,SQLCompiler._generate_generic_unary_operatorc                 K   s   |j j| fi |¤Ž| S r¯   r>  r.  rl   rl   rp   r    r/  z,SQLCompiler._generate_generic_unary_modifierc                 C   s   t jdtjd�S )Nz'%')rÙ   )r   Úliteral_columnr	   Ú
STRINGTYPEr­   rl   rl   rp   Ú_like_percent_literal  r  z!SQLCompiler._like_percent_literalc                 K   ó6   |  ¡ }| j}| |j¡ |¡|_| j||fi |¤ŽS r¯   ©Ú_cloner2  Ú__add__rY   Úvisit_like_op_binary©r¨   r   r¶  rÚ   Úpercentrl   rl   rp   Úvisit_contains_op_binary!  ó   z$SQLCompiler.visit_contains_op_binaryc                 K   r3  r¯   ©r5  r2  r6  rY   Úvisit_notlike_op_binaryr8  rl   rl   rp   Úvisit_notcontains_op_binary'  r;  z'SQLCompiler.visit_notcontains_op_binaryc                 K   ó0   |  ¡ }| j}| |j¡|_| j||fi |¤ŽS r¯   )r5  r2  Ú__radd__rY   r7  r8  rl   rl   rp   Úvisit_startswith_op_binary-  ó   z&SQLCompiler.visit_startswith_op_binaryc                 K   r?  r¯   )r5  r2  r@  rY   r=  r8  rl   rl   rp   Úvisit_notstartswith_op_binary3  rB  z)SQLCompiler.visit_notstartswith_op_binaryc                 K   r?  r¯   r4  r8  rl   rl   rp   Úvisit_endswith_op_binary9  rB  z$SQLCompiler.visit_endswith_op_binaryc                 K   r?  r¯   r<  r8  rl   rl   rp   Úvisit_notendswith_op_binary?  rB  z'SQLCompiler.visit_notendswith_op_binaryc                 K   óV   |j  dd ¡}d|jj| fi |¤Ž|jj| fi |¤Žf |r(d|  |tj¡  S d S )NÚescapez
%s LIKE %sú ESCAPE rÁ   ©Ú	modifiersrš  rC   r½   rY   Úrender_literal_valuer	   r1  ©r¨   r   r¶  rÚ   rG  rl   rl   rp   r7  E  s   þÿüúz SQLCompiler.visit_like_op_binaryc                 K   rF  )NrG  z%s NOT LIKE %srH  rÁ   rI  rL  rl   rl   rp   r=  R  ó   þÿüúz#SQLCompiler.visit_notlike_op_binaryc                 K   rF  )NrG  zlower(%s) LIKE lower(%s)rH  rÁ   rI  rL  rl   rl   rp   Úvisit_ilike_op_binary]  rM  z!SQLCompiler.visit_ilike_op_binaryc                 K   rF  )NrG  zlower(%s) NOT LIKE lower(%s)rH  rÁ   rI  rL  rl   rl   rp   Úvisit_notilike_op_binaryh  rM  z$SQLCompiler.visit_notilike_op_binaryc                 K   ó*   |j  dd¡}| j||rdndfi |¤ŽS )Nr_   Fz BETWEEN SYMMETRIC z	 BETWEEN ©rJ  rš  r$  ©r¨   r   r¶  rÚ   r_   rl   rl   rp   Úvisit_between_op_binarys  s   ÿÿz#SQLCompiler.visit_between_op_binaryc                 K   rP  )Nr_   Fz NOT BETWEEN SYMMETRIC z NOT BETWEEN rQ  rR  rl   rl   rp   Úvisit_notbetween_op_binaryy  s   
þýz&SQLCompiler.visit_notbetween_op_binaryc           	      K   s  |s|j jr|j  |¡}| j|dd�S |s|r7| jr7|jd u r,|jd u r,t d|j	 ¡‚| j
|fddi|¤ŽS |  |¡}|| jv rp| j| }||urp|jsP|jr_|j |j¡s_t d|j	 ¡‚|jse|jrpt d|j	|j	f ¡‚| | j|j	< | j|< | j|fd|ji|¤ŽS )NT)Úskip_bind_expressionz@Bind parameter '%s' without a renderable value not allowed here.rC  zIBind parameter '%s' conflicts with unique bind parameter of the same namezåbindparam() name '%s' is reserved for automatic usage in the VALUES or SET clause of this insert/update statement.   Please use a name other than column name when using bindparam() with insert() or update() (for example, 'b_%s').Ú	expanding)ræ   Ú_has_bind_expressionÚbind_expressionr¦   r!  r%  r3  r   rb  r$  Úrender_literal_bindparamÚ_truncate_bindparamrð   rf   rä   ÚintersectionÚ_is_crudrŽ  rV  )	r¨   r(  rC  r   rU  r¿   rX  rß   Úexistingrl   rl   rp   Úvisit_bindparam�  s\   ÿÿÿÿÿ


ÿÿþþÿ
úÿ
ÿÿÿzSQLCompiler.visit_bindparamc                 K   s   |j }|  ||j¡S r¯   )r4  rK  ræ   )r¨   r(  rÚ   r%  rl   rl   rp   rY  µ  s   z$SQLCompiler.render_literal_bindparamc                 C   s$   |  | j¡}|r||ƒS td| ƒ‚)a  Render the value of a bind parameter as a quoted literal.

        This is used for statement sections that do not accept bind parameters
        on the target driver/database.

        This should be implemented by subclasses using the quoting services
        of the DBAPI.

        z(Don't know how to literal-quote value %r)Ú_cached_literal_processorrœ   r¸   )r¨   r%  rÙ   Ú	processorrl   rl   rp   rK  ¹  s   ÿz SQLCompiler.render_literal_valuec                 C   s@   || j v r
| j | S |j}t|tjƒr|  d|¡}|| j |< |S )Nr(  )rò   r$  rU  r   rV  rW  )r¨   r(  Ú	bind_namerl   rl   rp   rZ  Ì  s   


zSQLCompiler._truncate_bindparamc                 C   sš   ||f| j v r| j ||f S | | j¡}t|ƒ| jd krB| j  |d¡}|dt| jd dƒ… d t|ƒdd …  }|d | j |< n|}|| j ||f< |S )Né   r   r   r  r   )r  Ú	apply_mapr   r,  rü   rš  ÚmaxÚhex)r¨   Úident_classrß   ÚanonnameÚcounterÚ	truncnamerl   rl   rp   rW  Ù  s   ÿþÿz!SQLCompiler._truncated_identifierc                 C   s
   || j  S r¯   )r   )r¨   rß   rl   rl   rp   Ú
_anonymizeì  r×   zSQLCompiler._anonymizec                 C   s<   |  dd¡\}}| j |d¡}|d | j|< |d t|ƒ S )Nr±  r   r  )Úsplitr   rš  rm   )r¨   r$  ÚidentÚderivedÚanonymous_counterrl   rl   rp   rÿ   ï  s   zSQLCompiler._process_anonc                 K   sF   | j r|d ur| |¡ n| j |¡ |rd| _d| S | jd|i S )NTz([EXPANDING_%s])rß   )rõ   rô  rö   Úcontains_expanding_parametersrú   )r¨   rß   Úpositional_namesrV  rÚ   rl   rl   rp   rŽ  õ  s   zSQLCompiler.bindparam_stringc                    s¨  ˆ   ¡  ||d< t|jtjƒrˆ  d|j¡}n|j}d}d}	|ˆ jv rIˆ j| }
||
u }	||
jv s5||
u r8d}n|
|jv rBˆ j|
= nt	 
d| ¡‚|sM|rj|jd urf|j}|jj}t|tjƒreˆ  d|¡}n|}d }|�r|ˆ j|< d|jjv rŠdˆ jvrŠˆ j d|jjd i¡ˆ _|ˆ jvr˜ˆ j|fi |¤Ž |�s|ˆ jv�r|jr§dˆ _ˆ j ||¡}|jrçt|jtjƒr¼|j}nt|jtjƒrÊ|jjd }nJ ‚dd	„ t |j¡D ƒ}|d
d ‡ fdd„|D ƒ¡ 7 }ˆ jróg  |d< ˆ j|< |d|jj ˆ fddi|¤Ž 7 }|j!�r|dˆ j"||j!fi |¤Ž 7 }|ˆ j|< |�rR|�s+|	�r+ˆ j ||¡S |�rKˆ j ||¡}ˆ j #|¡�rBˆ j $|¡}|ˆ  %|¡7 }|S ˆ j ||¡S d S )NÚvisiting_cterg  TFz5Multiple, unrelated CTEs found with the same name: %rÚ
autocommitr   c                 S   ó   g | ]}|d ur|‘qS r¯   rl   r´  rl   rl   rp   rÑ  T  s
    þz)SQLCompiler.visit_cte.<locals>.<listcomp>r˜  r}   c                 3   s   � | ]	}ˆ j  |¡V  qd S r¯   )rŸ   Úformat_column)rn   rl  r­   rl   rp   r&  [  s
   € 
ÿ
ÿz(SQLCompiler.visit_cte.<locals>.<genexpr>rp  z AS 
r@  r±  )&r  rU  rß   r   rV  rW  r  Ú	_restatesrû   r   rb  Ú
_cte_aliasrÞ   r¤   r¥   re   Ú	visit_cteÚ	recursiver  rŸ   Úformat_aliasÚoriginalr   ÚSelectÚCompoundSelectrø  r   Úunique_listÚinner_columnsrA   rõ   r  r½   Ú	_suffixesÚ_generate_prefixesÚ_requires_quotesrj  Úget_render_as_alias_suffix)r¨   Úcter@  ÚashintÚ	fromhintsrq  r¿   Úcte_nameÚ
is_new_cteÚembedded_in_current_named_cteÚexisting_cteÚpre_alias_cteÚcte_pre_alias_namerŠ  Ú
col_sourceÚ
recur_colsrl   r­   rp   rw    s®   	



ÿÿ
ÿ€

ÿÿÿ

þþÿ
ÿÿ
ÿÿ
ÿ
õzSQLCompiler.visit_ctec           	      K   s¦   |s|rt |jtjƒr|  d|j¡}n|j}|r| j ||¡S |rI|jj| fddi|¤Ž|  	| j ||¡¡ }|rG||v rG|  
|||| |¡}|S |jj| fi |¤ŽS )Nrg  r@  T)rU  rß   r   rV  rW  rŸ   ry  rz  r½   r‚  Úformat_from_hint_text)	r¨   rg  r@  r„  Úiscrudr…  r¿   Ú
alias_nameÚretrl   rl   rp   Úvisit_alias|  s0   	ÿÿÿÿþÿzSQLCompiler.visit_aliasc                 K   s   d|d< d| j |fi |¤Ž S )NTÚlateralz
LATERAL %s)r’  )r¨   r“  rÚ   rl   rl   rp   Úvisit_lateral�  s   zSQLCompiler.visit_lateralc                 K   sZ   d| j |fddi|¤Ž| ¡ j| fi |¤Žf }|jd ur+|d|jj| fi |¤Ž 7 }|S )Nz%s TABLESAMPLE %sr@  Tz REPEATABLE (%s))r’  Ú_get_methodr½   Úseed)r¨   Útablesampler@  rÚ   rŠ  rl   rl   rp   Úvisit_tablesample¡  s   þ
ÿzSQLCompiler.visit_tablesamplec                 C   s   d| S )Nr~   rl   )r¨   Úalias_name_textrl   rl   rp   r‚  ®  s   z&SQLCompiler.get_render_as_alias_suffixc                 C   s   | j  ||||f¡ d S r¯   )rô   rô  )r¨   Úkeynamerß   ÚobjectsrÙ   rl   rl   rp   r�  ±  r/  zSQLCompiler._add_to_result_mapc                    sj  ˆ j jr|rˆ j  ˆ ¡}‡ ‡fdd„}	n
ˆ }|rˆj}	nd}	|s#|}
n‚tˆ tjƒr;|ˆ ur8t|ˆ jˆ j	fd�}
nm|}
nj|durK|rKt||ˆ j
fd�}
nZ|rptˆ tjƒrpˆ jspˆ jdurptˆ jtjƒspt|t ˆ j¡ˆ jfd�}
n5tˆ tjƒs‘tˆ tjƒrˆ jr‘tˆ dƒrŠtˆ tjƒr‘t|ˆ jƒ}
n|ˆ ur£t|t ˆ j¡ˆ jfd�}
n|}
|j||	d� |
jˆfi |¤ŽS )z.produce labeled columns present in a select().c                    s   ˆ  | |ˆ f| |¡ d S r¯   )r�  )rš  rß   r›  rÙ   ©r   r¨   rl   rp   r[  Ã  s   ÿz;SQLCompiler._label_select_column.<locals>.add_to_result_mapN)râ   rß   r—  )ræ   Ú_has_column_expressionÚcolumn_expressionr�  rU  r   ÚLabelrÜ   rß   rÞ   Ú
_key_labelÚColumnClauserh  r`   r   r{  Ú_as_truncatedr$  Ú
TextClauseÚUnaryExpressionÚwraps_column_expressionÚhasattrr   ÚFunctionÚ
anon_labelÚupdater½   )r¨   rZ   r   r¢  r@  Úcolumn_clause_argsrß   rC  Úcol_exprr[  Úresult_exprrl   rœ  rp   Ú_label_select_column´  sp   ÿ
ÿÿ
þý
ÿ
ý
ÿ
ýüù
ø
ýþz SQLCompiler._label_select_columnc                 C   s    |   ||¡}|r|d| 7 }|S r)  )Úget_from_hint_text)r¨   Úsqltextr`   Úhintr�  Úhinttextrl   rl   rp   rŽ    s   z!SQLCompiler.format_from_hint_textc                 C   ó   d S r¯   rl   )r¨   Úbyfromsrl   rl   rp   Úget_select_hint_text  ré   z SQLCompiler.get_select_hint_textc                 C   r²  r¯   rl   ©r¨   r`   rŠ  rl   rl   rp   r®    ré   zSQLCompiler.get_from_hint_textc                 C   r²  r¯   rl   rµ  rl   rl   rp   Úget_crud_hint_text  ré   zSQLCompiler.get_crud_hint_textc                 C   s
   d  |¡S r)  ©rA   )r¨   Ú
hint_textsrl   rl   rp   Úget_statement_hint_text  r×   z#SQLCompiler.get_statement_hint_textc                    s"   i ‰ i g‰‡ ‡‡fdd„‰ˆ|ƒS )z×Rewrite any "a JOIN (b JOIN c)" expression as
        "a JOIN (select * from b JOIN c) AS anon", to support
        databases that can't parse a parenthesized join correctly
        (i.e. sqlite < 3.7.16).

        c           
         sì  | ˆd v rˆd |  S | ˆ v rˆ |  S |   ¡  }ˆ | < |jr­|jr­t|jtjƒr­| ¡  ˆ|jfi |¤Ž|_ˆ|jfi |¤Ž}tj	|j
gdd� ¡ }|jD ]
}|j|_|j|_qNtt|jj
j|jƒƒ}|||j
j< |||j
j< |||jj
j< |||jj
j< tˆd  ¡ ƒD ]\}}||v r–|| ˆd |< q†ˆd  |¡ ||_ˆ|jfi |¤Ž|_|S |jrÀd|d< |jddˆi|¤Ž |S |jrê|jrê| dd ¡dk}	|	rÕˆ i ¡ d|d< |jddˆi|¤Ž |	rèˆd= |S |jddˆi|¤Ž |S )	Nr  T)Ú
use_labelsÚselect_containerÚtransform_clueÚcloneÚinside_selectrl   )r5  Úis_selectableÚ_is_joinrU  rY   r   ÚFromGroupingÚ_reset_exportedrC   r{  rÞ   rg  r£  r$  r   rß   Ú_labelr)  Úzipr  Úitemsr©  ÚonclauseÚ_is_from_containerÚ_copy_internalsÚ
_is_selectrš  rô  )
rÞ   rÚ   ÚnewelemrY   Úselectable_r£  Útranslate_dictÚkÚvÚbarrier_select©ÚclonedÚcolumn_translateÚvisitrl   rp   rÓ  #  sj   ÿþýÿþ

ÿ€ëðÿ
þz=SQLCompiler._transform_select_for_nested_joins.<locals>.visitrl   )r¨   rZ   rl   rÐ  rp   Ú"_transform_select_for_nested_joins  s   Qz.SQLCompiler._transform_select_for_nested_joinsc                    sF   t dd„ |jD ƒƒ‰t ‡fdd„|jD ƒƒ‰ ‡ fdd„| jD ƒ| _d S )Nc                 s   s   � | ]}|j |fV  qd S r¯   ©r   r´  rl   rl   rp   r&  y  ó   € 

ÿzESQLCompiler._transform_result_map_for_nested_joins.<locals>.<genexpr>c                 3   s   � | ]
}ˆ |j  |fV  qd S r¯   rÕ  r´  )Ú	inner_colrl   rp   r&  }  ó   € c                    ó2   g | ]\}}}}||t ‡ fd d„|D ƒƒ|f‘qS )c                    s   g | ]}ˆ   ||¡‘qS rl   ©rš  )rn   rá   ©Údrl   rp   rÑ  €  ó    zQSQLCompiler._transform_result_map_for_nested_joins.<locals>.<listcomp>.<listcomp>©Útuple)rn   r$  rß   ÚobjsÚtyprÛ  rl   rp   rÑ    ó    
ÿÿzFSQLCompiler._transform_result_map_for_nested_joins.<locals>.<listcomp>)r)  r~  rô   )r¨   rZ   Útransformed_selectrl   )rÜ  r×  rp   Ú&_transform_result_map_for_nested_joinsv  s   ÿ
þz2SQLCompiler._transform_result_map_for_nested_joinsrð  rñ  c           	      C   s^   | j  }|r	| jn| j d }|d }|d }|r&|s&|j| |¡dd�}|S |j||d�}|S )Nr  rð  rñ  rl   ©Úexplicit_correlate_fromsÚimplicit_correlate_froms)ró   r™  Ú_get_display_fromsÚ
difference)	r¨   rZ   r@  r“  r¡  r  rð  rñ  Úfromsrl   rl   rp   Ú_display_froms_for_selectˆ  s"   ÿüüþz%SQLCompiler._display_froms_for_selectc	                    s`  ˆj o| oˆj oˆjj }
|
r%ˆ ˆ¡}ˆj|fˆ |||ddœ|	¤Ž}ˆj }|r.ˆjnˆjd }|pD|dko>| dd¡pD| dd¡‰ˆsNd|	v rN|	d= |
rZˆrXˆ ˆ|¡ |S ˆ 	ˆ|ˆ |¡}|	 
¡ ‰ˆ ddd	œ¡ d
}ˆjrƒˆ ˆ¡\}}|r‚||d 7 }nd }ˆjr•|ˆjˆˆjfi |	¤Ž7 }|ˆjˆfi |	¤Ž7 }dd„ ‡ ‡‡‡‡fdd„ˆjD ƒD ƒ}ˆr×|d ur×ttdd„ ˆjD ƒdd„ |jD ƒƒƒ‰‡fdd„ˆjD ƒˆ_ˆ |ˆ||||	¡}ˆjrù‡fdd„ˆjD ƒ}|rù|dˆ |¡ 7 }ˆj�r|�rˆ ¡ | }ˆj�r|dˆjˆˆjfi |	¤Ž 7 }ˆj d¡ ˆ �s%|�r.|�r.d| d S |S )NT)r@  r   r…  rŸ  Únested_join_translationr  r   r–  Fr  r[  )rT  rC  zSELECT r±  c                 S   rs  r¯   rl   r´  rl   rl   rp   rÑ  ñ  s
    ôz,SQLCompiler.visit_select.<locals>.<listcomp>c              
      s&   g | ]\}}ˆj ˆ|ˆˆ ˆ|d �‘qS )rx  ©r­  )rn   rß   r   )r@  rª  r¢  rZ   r¨   rl   rp   rÑ  ó  s    	øúÿc                 S   ó   g | ]\}}|‘qS rl   rl   ©rn   r$  rß   rl   rl   rp   rÑ    rr   c                 S   rî  rl   rl   rï  rl   rl   rp   rÑ    s    ÿÿc                    rÙ  )c                 3   s   � | ]	}ˆ   ||¡V  qd S r¯   rÚ  )rn   Úo©Ú	translaterl   rp   r&    s   € z6SQLCompiler.visit_select.<locals>.<listcomp>.<genexpr>rÞ  )rn   r$  rß   r¾   rÙ   rñ  rl   rp   rÑ    râ  c                    s$   g | ]\}}|d ˆ j jfv r|‘qS ©Ú*©rœ   rß   )rn   Údialect_nameÚhtr­   rl   rp   rÑ    s
    þr<  r=  )rº  ró   rœ   Úsupports_right_nested_joinsrÔ  Úvisit_selectr™  rš  rä  Ú_setup_select_stackÚcopyr©  Ú_hintsÚ_setup_select_hintsÚ	_prefixesr€  Úget_select_precolumnsÚ_columns_plus_namesr)  rÄ  rô   Ú_compose_select_bodyÚ_statement_hintsr¹  rû   rþ  r  r  )r¨   rZ   r@  r   r…  rŸ  rì  Úselect_wraps_forr“  r¿   Úneeds_nested_translationrã  rŠ  r¡  r  rê  Ú	hint_textÚbyfromr~  Úper_dialectrl   )r@  rª  r¢  rZ   r¨   rò  rp   rù  ¡  s¶   ÿþüÿÿúù

ý
úÿÿ€	÷þþþÿ

þÿ
þÿ
ÿzSQLCompiler.visit_selectc                    s.   t ‡ fdd„|j ¡ D ƒƒ}ˆ  |¡}||fS )Nc              	      s>   g | ]\\}}}|d ˆ j jfv r||d|jˆ dd�i f‘qS )rô  rß   T)r„  ©rœ   rß   r½   )rn   Úfrom_rœ   r±  r­   rl   rp   rÑ  2  s    
ûÿþz3SQLCompiler._setup_select_hints.<locals>.<listcomp>)r)  rü  rÅ  r´  )r¨   rZ   r  r  rl   r­   rp   rý  0  s   
úÿ
zSQLCompiler._setup_select_hintsc                 C   sp   |d }|d }|r|s|j | |¡dd�}n|j ||d�}ttj|Ž ƒ}| |¡}	||	|dœ}
| j |
¡ |S )Nrð  rñ  rl   rå  )rñ  rð  r   )rè  ré  r\   r   Ú_from_objectsre   ró   rô  )r¨   rZ   r  r@  r“  rð  rñ  rê  Únew_correlate_fromsÚall_correlate_fromsÚ	new_entryrl   rl   rp   rú  ?  s*   ÿüþ
ýzSQLCompiler._setup_select_stackc                    sT  |d  |¡7 }|r1|d7 }|jr!|d  ‡ ‡‡fdd„|D ƒ¡7 }n|d  ‡‡fdd„|D ƒ¡7 }n|ˆ ¡ 7 }|jd urN|jjˆfi ˆ¤Ž}|rN|d| 7 }|jjr]|ˆj|fi ˆ¤Ž7 }|jd urt|jjˆfi ˆ¤Ž}|rt|d| 7 }|j	jrƒ|ˆj
|fi ˆ¤Ž7 }|jd us�|jd ur˜|ˆj|fi ˆ¤Ž7 }|jd ur¨|ˆj|fi ˆ¤Ž7 }|S )Nr}   z 
FROM c                    s$   g | ]}|j ˆfd ˆ dœˆ¤Ž‘qS )T©r@  r…  r¼   ©rn   Úf©r  r¿   r¨   rl   rp   rÑ  f  s    ýÿÿÿÿz4SQLCompiler._compose_select_body.<locals>.<listcomp>c                    s"   g | ]}|j ˆfd diˆ ¤Ž‘qS )r@  Tr¼   r  rÐ  rl   rp   rÑ  o  s    ÿÿz 
WHERE z	 
HAVING )rA   rü  r;  Ú_whereclauser½   Ú_group_by_clauser·  rù  Ú_havingÚ_order_by_clauserú  rû  rü  rý  Ú_for_update_argÚfor_update_clause)r¨   rŠ  rZ   r~  rê  r  r¿   Útrl   r  rp   r  \  sB   üÿ	þÿ




z SQLCompiler._compose_select_bodyc                    s*   d  ‡ ‡fdd„|D ƒ¡}|r|d7 }|S )Nr±  c                 3   s:   � | ]\}}|d u s|ˆj jkr|jˆfi ˆ ¤ŽV  qd S r¯   r  )rn   Úprefixrö  rµ  rl   rp   r&  “  s   € þýz1SQLCompiler._generate_prefixes.<locals>.<genexpr>r·  )r¨   ÚstmtÚprefixesrÚ   r¾  rl   rµ  rp   r€  ’  s   þzSQLCompiler._generate_prefixesc                    sb   ˆ j rt‡ fdd„ˆ jD ƒg ƒˆ j ˆ _ˆ  ˆ j¡d }|d dd„ ˆ j ¡ D ƒ¡7 }|d7 }|S )Nc                    s   g | ]}ˆ j | ‘qS rl   )r  )rn   rƒ  r­   rl   rp   rÑ  Ÿ  s    z2SQLCompiler._render_cte_clause.<locals>.<listcomp>r±  ú, 
c                 S   s   g | ]}|‘qS rl   rl   )rn   Útxtrl   rl   rp   rÑ  £  s    z
 )rõ   Úsumrû   rö   Úget_cte_preambler  rA   Úvalues)r¨   Úcte_textrl   r­   rp   rþ  œ  s   ÿÿzSQLCompiler._render_cte_clausec                 C   s   |rdS dS )NzWITH RECURSIVEÚWITHrl   )r¨   rx  rl   rl   rp   r  §  s   zSQLCompiler.get_cte_preamblec                 K   s   |j rdpdS )zcCalled when building a ``SELECT`` statement, position is just
        before column list.

        r   rÁ   )Ú	_distinct©r¨   rZ   rÚ   rl   rl   rp   rÿ  ­  s   z!SQLCompiler.get_select_precolumnsc                 K   ó$   |j j| fi |¤Ž}|rd| S dS )z5allow dialects to customize how GROUP BY is rendered.z
 GROUP BY rÁ   )r  r½   )r¨   rZ   rÚ   Úgroup_byrl   rl   rp   rù  ´  ó   zSQLCompiler.group_by_clausec                 K   r%  )z5allow dialects to customize how ORDER BY is rendered.z
 ORDER BY rÁ   )r  r½   )r¨   rZ   rÚ   rÖ  rl   rl   rp   rú  ½  r'  zSQLCompiler.order_by_clausec                 K   r¬   )Nz FOR UPDATErl   r$  rl   rl   rp   r  Æ  ré   zSQLCompiler.for_update_clausec                 C   r`  )Nz@RETURNING is not supported by this dialect's statement compiler.ra  )r¨   r  Úreturning_colsrl   rl   rp   Úreturning_clauseÉ  re  zSQLCompiler.returning_clausec                 K   sf   d}|j d ur|d| j|j fi |¤Ž 7 }|jd ur1|j d u r#|d7 }|d| j|jfi |¤Ž 7 }|S )NrÁ   z
 LIMIT z

 LIMIT -1z OFFSET )rû  r¦   rü  )r¨   rZ   rÚ   rŠ  rl   rl   rp   rý  Ï  s   


zSQLCompiler.limit_clausec           
      K   sr   |s|r7| j  |¡}|r|r| j  |¡d | j  |j¡ }	n| j  |j¡}	|r5||v r5|  |	||| |¡}	|	S dS )Nrf  rÁ   )rŸ   rl  rm  rj  rß   rŽ  )
r¨   r`   r@  r�  r„  r…  Ú
use_schemar¿   rp  r‘  rl   rl   rp   Úvisit_tableÙ  s    

ÿþÿÿzSQLCompiler.visit_tablec                 K   sh   |j rd}n|jrd}nd}|jj| fddi|¤Ž| |jj| fddi|¤Ž d |jj| fi |¤Ž S )Nz FULL OUTER JOIN z LEFT OUTER JOIN z JOIN r@  Tz ON )r5   ÚisouterrC   r½   rY   rÆ  )r¨   rA   r@  r¿   Ú	join_typerl   rl   rp   Ú
visit_joinö  s   ÿþýüÿzSQLCompiler.visit_joinc                    sF   t ‡ fdd„|j ¡ D ƒƒ}|j|v rˆ  ||j||j d¡}||fS )Nc                    s,   g | ]\\}}}|d ˆ j jfv r||f‘qS ró  rõ  )rn   r`   rœ   r  r­   rl   rp   rÑ  	  s
    
þz1SQLCompiler._setup_crud_hints.<locals>.<listcomp>T)r)  rü  rÅ  r`   rŽ  )r¨   r  Ú
table_textÚdialect_hintsrl   r­   rp   Ú_setup_crud_hints	  s   
þÿ
ÿzSQLCompiler._setup_crud_hintsc                    sŽ  | j  }| j  tƒ tƒ |dœ¡ tj| |tjfi |¤Ž}|s/| jjs/| jjs/t	 
d| jj ¡‚|jrD| jjs?t	 
d| jj ¡‚|d }n|}| j‰ | jj}d}|jr_|| j||jfi |¤Ž7 }|d7 }ˆ  |j¡}	|jru|  ||	¡\}
}	nd }
||	7 }|s|s�|dd ‡ fd	d
„|D ƒ¡ 7 }| js•|jr©|  || jp�|j¡}| jr¨|d| 7 }nd }|jd urÕ| j| jfi |¤Ž}| jrÎ|rÎ| jjrÎ|d|  ¡ |f 7 }n0|d| 7 }n)|sÞ|rÞ|d7 }n |jrð|dd dd„ |D ƒ¡ 7 }n|dd dd
„ |D ƒ¡ 7 }|j d u�r| j|j fi |¤Ž}|�r|d| 7 }|�r$| j�s$|d| 7 }| j�r6|�r6| jj�s6|  ¡ | }| j  !d¡ |�rEd| d S |S )N©rð  rñ  r   zWThe '%s' dialect with current database version settings does not support empty inserts.zcThe '%s' dialect with current database version settings does not support in-place multirow inserts.r   zINSERT zINTO z (%s)r}   c                    s   g | ]	}ˆ   |d  ¡‘qS )r   )rt  r´  ©rŸ   rl   rp   rÑ  P	  s    z,SQLCompiler.visit_insert.<locals>.<listcomp>r±  z %s%sz %sz DEFAULT VALUESz
 VALUES %sc                 s   s(   � | ]}d d  dd„ |D ƒ¡ V  qdS )r˜  r}   c                 s   s   � | ]}|d  V  qdS )r   Nrl   r´  rl   rl   rp   r&  i	  s   € z5SQLCompiler.visit_insert.<locals>.<genexpr>.<genexpr>Nr·  )rn   Úcrud_param_setrl   rl   rp   r&  h	  ó
   € ÿ
ÿz+SQLCompiler.visit_insert.<locals>.<genexpr>z VALUES (%s)c                 S   s   g | ]}|d  ‘qS )r   rl   r´  rl   rl   rp   rÑ  n	  rr   r  r<  r=  )"ró   rô  r\   r   Ú_setup_crud_paramsÚISINSERTrœ   Úsupports_default_valuesÚsupports_empty_insertr   rb  rß   Ú_has_multi_parametersÚsupports_multivalues_insertrŸ   rþ  r€  Úformat_tabler`   rü  r1  rA   r  r  r)  Úreturning_precedes_valuesrZ   r¦   Ú_insert_from_selectrû   Úcte_follows_insertrþ  Ú_post_values_clauser  )r¨   Úinsert_stmtr@  rÚ   r¡  Úcrud_paramsÚcrud_params_singler8  rŠ  r/  r0  r)  Úselect_textÚpost_values_clauserl   r3  rp   Úvisit_insert	  s¶   ýÿÿÿÿþýþÿþÿ
ÿÿ
ÿÿÿ€


þÿÿÿzSQLCompiler.visit_insertc                 C   r¬   )z3Provide a hook for MySQL to add LIMIT to the UPDATENrl   )r¨   Úupdate_stmtrl   rl   rp   Úupdate_limit_clause„	  r/  zSQLCompiler.update_limit_clausec                 K   s   d|d< |j | fddi|¤ŽS )z|Provide a hook to override the initial table clause
        in an UPDATE statement.

        MySQL overrides this.

        Tr@  r�  r¼   )r¨   rG  Ú
from_tableÚextra_fromsrÚ   rl   rl   rp   Úupdate_tables_clauseˆ	  s   z SQLCompiler.update_tables_clausec                 K   ó   t dƒ‚)z~Provide a hook to override the generation of an
        UPDATE..FROM clause.

        MySQL and MSSQL override this.

        zCThis backend does not support multiple-table criteria within UPDATEr·   ©r¨   rG  rI  rJ  Ú
from_hintsrÚ   rl   rl   rp   Úupdate_from_clause’	  s   	ÿzSQLCompiler.update_from_clausec                    s  ˆj  }|j}t|ƒ}|r$tt |j¡ƒ‰‡fdd„|D ƒ}ˆ |¡}ng }|jh}ˆj  |||dœ¡ d}	|j	rF|	ˆj
||j	fi |¤Ž7 }	ˆj||j|fi |¤Ž}
tjˆ|tjfi |¤Ž}|jrjˆ ||
¡\}}
nd }|	|
7 }	|	d7 }	|oxˆj‰ |	d ‡ ‡fdd„|D ƒ¡7 }	ˆjsŽ|jrŸˆjrŸ|	d	ˆ |ˆjp›|j¡ 7 }	|r¶ˆj||j||fi |¤Ž}|r¶|	d	| 7 }	|jd urÍˆj|jfi |¤Ž}|rÍ|	d
| 7 }	ˆ |¡}|rÚ|	d	| 7 }	ˆjsà|jrñˆjsñ|	d	ˆ |ˆjpí|j¡ 7 }	ˆjrü|rüˆ ¡ |	 }	ˆj  d¡ |�rd|	 d S |	S )Nc                    s   g | ]}|ˆ vr|‘qS rl   rl   r  )Ú
main_fromsrl   rp   rÑ  ©	  s    z,SQLCompiler.visit_update.<locals>.<listcomp>r2  zUPDATE z SET r}   c                 3   s.   � | ]}|d  j ˆˆ d�d |d  V  qdS )r   )rn  ú=r   Nr¼   r´  )rn  r¨   rl   rp   r&  Ô	  s   € ýÿþ
ÿz+SQLCompiler.visit_update.<locals>.<genexpr>r±  ú WHERE r  r<  r=  )ró   Ú_extra_fromsÚboolr\   r   r
  r`   re   rô  rþ  r€  rK  r   r6  ÚISUPDATErü  r1  Ú'render_table_with_column_in_update_fromrA   r  r  r=  r)  rO  r  r¦   rH  rû   rþ  r  )r¨   rG  r@  rÚ   r¡  rJ  Úis_multitableÚrender_extra_fromsrð  rŠ  r/  rB  r0  Úextra_from_textr  rý  rl   )rn  rP  r¨   rp   Úvisit_update 	  s¨   
ÿýÿÿÿÿÿÿÿ
ÿÿ
üÿüû

ÿÿþÿ
zSQLCompiler.visit_updatec                 C   s   t  | | j¡S r¯   )r   Ú_key_getters_for_crud_columnr¡   r­   rl   rl   rp   r[  
  s   z(SQLCompiler._key_getters_for_crud_columnc                 K   rL  )zÀProvide a hook to override the generation of an
        DELETE..FROM clause.

        This can be used to implement DELETE..USING for example.

        MySQL and MSSQL override this.

        zCThis backend does not support multiple-table criteria within DELETEr·   rM  rl   rl   rp   Údelete_extra_from_clause

  s   ÿz$SQLCompiler.delete_extra_from_clausec                 C   s   |j | ddd�S )NT)r@  r�  r¼   )r¨   Údelete_stmtrI  rJ  rl   rl   rp   Údelete_table_clause
  ó   zSQLCompiler.delete_table_clausec                 K   s~  | j  }tj| |tjfi |¤Ž |j}|jh |¡}| j  |||dœ¡ d}|jr6|| j	||jfi |¤Ž7 }|d7 }|  
||j|¡}|jrN|  ||¡\}	}nd }	||7 }|jre| jre|d|  ||j¡ 7 }|r|| j||j||	fi |¤Ž}
|
r||d|
 7 }|jd ur“|jj| fi |¤Ž}|r“|d| 7 }|jr¤| js¤|d|  ||j¡ 7 }| jr¯|r¯|  ¡ | }| j  d¡ |r½d| d S |S )	Nr2  zDELETE úFROM r±  rR  r  r<  r=  )ró   r   r6  ÚISDELETErS  r`   re   rô  rþ  r€  r^  rü  r1  r  r=  r)  r\  r  r½   rû   rþ  r  )r¨   r]  r@  rÚ   r¡  rJ  rð  rŠ  r/  r0  rY  r  rl   rl   rp   Úvisit_delete
  sr   ýÿÿÿÿ
ÿÿüû
ÿ
zSQLCompiler.visit_deletec                 C   ó   d| j  |¡ S )NzSAVEPOINT %s©rŸ   Úformat_savepoint©r¨   Úsavepoint_stmtrl   rl   rp   Úvisit_savepointg
  r_  zSQLCompiler.visit_savepointc                 C   rc  )NzROLLBACK TO SAVEPOINT %srd  rf  rl   rl   rp   Úvisit_rollback_to_savepointj
  ó   ÿz'SQLCompiler.visit_rollback_to_savepointc                 C   rc  )NzRELEASE SAVEPOINT %srd  rf  rl   rl   rp   Úvisit_release_savepointo
  rj  z#SQLCompiler.visit_release_savepoint)NF)NNT©F)NFFN)NT)NFTr¯   )FTr   )FFF)FFNN)FFFN)FTNr   FNF)FFFNT)›rÎ   rÏ   rÐ   rÑ   ÚEXTRACT_MAPrß  ÚCOMPOUND_KEYWORDSrõ  r  r  r  r’  r  r=  rV  ro  r!  r›  r  rø   r	  r
  r«   rÕ   r  r   Úmemoized_instancemethodr  Ú
contextlibÚcontextmanagerr  r  Úmemoized_propertyr*  r-  r¹   rÅ   r´   Údependenciesr9  r;  rA  rM  rR  r_  rd  rs  rv  rz  r}  r�  r‹  ri  r•  r¤  r¨  r­  r°  rº  rÀ  rÄ  rÇ  rÎ  rØ  rÚ  rÞ  râ  ré  rí  rê  rç  r  r  r  r  r  r  r  r  r  r  r'  r(  r*  r,  r$  r
  r  r2  r:  r>  rA  rC  rD  rE  r7  r=  rN  rO  rS  rT  r^  rY  rK  rZ  rW  rj  rÿ   rŽ  rw  r’  r”  r˜  r‚  r�  r­  rŽ  r´  r®  r¶  r¹  rÔ  rä  rÓ   Ú	frozensetr™  rë  rù  rý  rú  r  r€  rþ  r  rÿ  rù  rú  r  r)  rý  r+  r.  r1  rF  rH  rK  rO  rZ  r[  r\  r^  rb  rh  ri  rk  rl   rl   rl   rp   rì   ¢  sŒ   ÿH




8

	ÿ#ÿú1ÿ&ÿ ÿ3				ÿÿ
û4ÿú|ú!
øS]ÿ÷ 6
		ùq
f
Jrì   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚStrSQLCompileraw  A :class:`.SQLCompiler` subclass which allows a small selection
    of non-standard SQL features to render into a string value.

    The :class:`.StrSQLCompiler` is invoked whenever a Core expression
    element is directly stringified without calling upon the
    :meth:`.ClauseElement.compile` method.   It can render a limited set
    of non-standard SQL constructs to assist in basic stringification,
    however for more substantial custom or dialect-specific SQL constructs,
    it will be necessary to make use of :meth:`.ClauseElement.compile`
    directly.

    .. seealso::

        :ref:`faq_sql_expression_string`

    c                 C   r¬   )Nz<name unknown>rl   rc  rl   rl   rp   rd  ‡
  ré   z$StrSQLCompiler._fallback_column_namec                 K   s,   d| j |jfi |¤Ž| j |jfi |¤Žf S )Nz%s[%s])r¦   rC   rY   r  rl   rl   rp   Úvisit_getitem_binaryŠ
  rÈ  z#StrSQLCompiler.visit_getitem_binaryc                 K   ó   | j ||fi |¤ŽS r¯   ©rv  r  rl   rl   rp   Úvisit_json_getitem_op_binary�
  rÅ  z+StrSQLCompiler.visit_json_getitem_op_binaryc                 K   rw  r¯   rx  r  rl   rl   rp   Ú!visit_json_path_getitem_op_binary“
  rÅ  z0StrSQLCompiler.visit_json_path_getitem_op_binaryc                    s&   ‡ fdd„t  |¡D ƒ}dd |¡ S )Nc              	      s   g | ]}ˆ   d |ddi ¡‘qS )NTFrí  r´  r­   rl   rp   rÑ  —
  s    ÿÿz3StrSQLCompiler.returning_clause.<locals>.<listcomp>z
RETURNING r}   )r   Ú_select_iterablesrA   )r¨   r  r(  Úcolumnsrl   r­   rp   r)  –
  s   
þzStrSQLCompiler.returning_clausec                    s    dd  ‡ ‡‡fdd„|D ƒ¡ S )Nr`  r}   c                 3   ó(   � | ]}|j ˆfd ˆ dœˆ¤ŽV  qdS ©Tr  Nr¼   ©rn   r  ©rN  rÚ   r¨   rl   rp   r&  ¡
  r5  z4StrSQLCompiler.update_from_clause.<locals>.<genexpr>r·  rM  rl   r€  rp   rO  ž
  ó   
þz!StrSQLCompiler.update_from_clausec                    s    dd  ‡ ‡‡fdd„|D ƒ¡ S )Nr}   c                 3   r}  r~  r¼   r  r€  rl   rp   r&  ©
  r5  z:StrSQLCompiler.delete_extra_from_clause.<locals>.<genexpr>r·  rM  rl   r€  rp   r\  ¦
  r�  z'StrSQLCompiler.delete_extra_from_clauseN)rÎ   rÏ   rÐ   rÑ   rd  rv  ry  rz  r)  rO  r\  rl   rl   rl   rp   ru  u
  s    ru  c                   @   sF  e Zd Zejdd„ ƒZejdd„ ƒZdLdd„Zdd	„ Zd
d„ Z	dd„ Z
dd„ ZdMdd„Z	dLdd„Zdd„ Zdd„ Zdd„ Z	dNdd„Zdd„ ZdMd d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Z d<d=„ Z!d>d?„ Z"d@dA„ Z#dBdC„ Z$dDdE„ Z%dFdG„ Z&dHdI„ Z'dJdK„ Z(dS )OÚDDLCompilerc                 C   s   | j  | j d ¡S r¯   )rœ   Ústatement_compilerr­   rl   rl   rp   r¹   °
  r  zDDLCompiler.sql_compilerc                 C   rã   r¯   )rœ   r  r­   rl   rl   rp   r  ´
  rå   zDDLCompiler.type_compilerNc                 C   r²  r¯   rl   rÄ   rl   rl   rp   rÅ   ¸
  ré   zDDLCompiler.construct_paramsc                 K   sš   |j }t|jtjƒrD| ¡ }| j}| |j¡}t|ƒdkr%|d d}}n	|d |d }}| 	d|¡ | 	d|¡ | 	d| 
|j¡¡ | j |j| ¡S )Nr   r   rÁ   r  r`   r   Úfullname)ÚcontextrU  Útargetr   ÚTablerû  rŸ   Úformat_table_seqr,  Ú
setdefaultr<  r¹   r‹  r¡   )r¨   Úddlr¿   r…  rŸ   Úpathr`   Úschrl   rl   rp   Ú	visit_ddl»
  s   zDDLCompiler.visit_ddlc                 C   s   | j  |j¡}d| S )NzCREATE SCHEMA )rŸ   Úformat_schemarÞ   )r¨   r!   r   rl   rl   rp   Úvisit_create_schemaÎ
  s   zDDLCompiler.visit_create_schemac                 C   s(   | j  |j¡}d| }|jr|d7 }|S )NzDROP SCHEMA ú CASCADE)rŸ   rŽ  rÞ   Úcascade)r¨   Údropr   rŠ  rl   rl   rp   Úvisit_drop_schemaÒ
  s
   zDDLCompiler.visit_drop_schemac                 C   sJ  |j }| j}d}|jr|d |j¡d 7 }|d| |¡ d 7 }|  |¡}|r-||d 7 }|d7 }d}d}|jD ]O}|j }	z"| j||	joF| d�}
|
d urY||7 }d}|d	|
 7 }|	jr^d
}W q8 t	j
y‡ } zt t	 
t d¡|j|	j|jd f ¡¡ W Y d }~q8d }~ww | j||jd�}|rš||d	 | 7 }|d|  |¡ 7 }|S )Nz
CREATE r±  zTABLE r<  Ú
F©Úfirst_pkr  ú	Tz (in table '%s', column '%s'): %sr   )Ú _include_foreign_key_constraintsz
)%s

)rÞ   rŸ   rþ  rA   r<  Úcreate_table_suffixr|  r¦   Úprimary_keyr   rb  r   Úraise_from_causeÚuÚdescriptionrß   ÚargsÚcreate_table_constraintsÚinclude_foreign_key_constraintsÚpost_create_table)r¨   r!   r`   rŸ   rŠ  r™  Ú	separatorr–  Úcreate_columnr   Ú	processedÚceÚconstrl   rl   rp   Úvisit_create_tableÙ
  sV   

ÿ€ÿÿÿ€ÿþzDDLCompiler.visit_create_tableFc                    sL   |j }|jrd S ˆ j||d�}d ‡ fdd„|jD ƒ¡}|r$|d| 7 }|S )Nr•  r±  c                 3   s   � | ]}ˆ   |¡V  qd S r¯   )r¦   ©rn   r    r­   rl   rp   r&    rÖ  z2DDLCompiler.visit_create_column.<locals>.<genexpr>)rÞ   ÚsystemÚget_column_specificationrA   Úconstraints)r¨   r!   r–  r   rŠ  r¦  rl   r­   rp   Úvisit_create_column
  s   ÿzDDLCompiler.visit_create_columnc                    st   g }ˆj r| ˆj ¡ ˆj}|d ur| |¡‰ ntƒ ‰ | ‡ ‡fdd„ˆjD ƒ¡ d dd„ ‡fdd„|D ƒD ƒ¡S )Nc                    s"   g | ]}|ˆj ur|ˆ vr|‘qS rl   )rš  r´  )Ú	omit_fkcsr`   rl   rp   rÑ  *  s
    þz8DDLCompiler.create_table_constraints.<locals>.<listcomp>z, 
	c                 s   s   � | ]	}|d ur|V  qd S r¯   rl   )rn   Úprl   rl   rp   r&  1  s   € óòz7DDLCompiler.create_table_constraints.<locals>.<genexpr>c                 3   sB   � | ]}|j d u s|  ˆ ¡rˆ jjrt|ddƒsˆ  |¡V  qd S )NÚ	use_alterF)Ú_create_rulerœ   Úsupports_alterrï   r¦   r¨  r­   rl   rp   r&  3  s   € 
ÿü
ûýü)rš  rô  Úforeign_key_constraintsré  r\   ÚextendÚ_sorted_constraintsrA   )r¨   r`   r˜  r«  Úall_fkcsrl   )r­  r¨   r`   rp   rŸ    s"   þÿ

þþz$DDLCompiler.create_table_constraintsc                 C   ó   d| j  |j¡ S )Nz
DROP TABLE ©rŸ   r<  rÞ   ©r¨   r’  rl   rl   rp   Úvisit_drop_tableB  rÀ   zDDLCompiler.visit_drop_tablec                 C   r¶  )Nz
DROP VIEW r·  r¸  rl   rl   rp   Úvisit_drop_viewE  rÀ   zDDLCompiler.visit_drop_viewc                 C   s   |j d u rt d|j ¡‚d S )Nz,Index '%s' is not associated with any table.)r`   r   rb  rß   )r¨   r|  rl   rl   rp   Ú_verify_index_tableH  s
   
ÿÿzDDLCompiler._verify_index_tableTc              	      sj   |j }ˆ  |¡ ˆ j}d}|jr|d7 }|dˆ j||d�|j|j|d�d ‡ fdd„|jD ƒ¡f 7 }|S )	NzCREATE zUNIQUE zINDEX %s ON %s (%s)©Úinclude_schema©r*  r}   c                 3   s"   � | ]}ˆ j j|d dd�V  qdS )FT©rn  r   N)r¹   r¦   )rn   r§  r­   rl   rp   r&  \  s   € ýÿ
ÿz1DDLCompiler.visit_create_index.<locals>.<genexpr>)	rÞ   r»  rŸ   rf   Ú_prepared_index_namer<  r`   rA   Úexpressions)r¨   r!   r½  Úinclude_table_schemar|  rŸ   rŠ  rl   r­   rp   Úvisit_create_indexN  s    
ÿüûzDDLCompiler.visit_create_indexc                 C   s   |j }d| j|dd� S )Nz
DROP INDEX Tr¼  )rÞ   rÀ  )r¨   r’  r|  rl   rl   rp   Úvisit_drop_indexe  s   ÿzDDLCompiler.visit_drop_indexc                 C   sº   |j d ur| j |j ¡}nd }|r|r| j |¡}nd }|j}t|tjƒrG| jj	p,| jj
}t|ƒ|krF|d|d … d t |¡dd …  }n| j |¡ | j |¡}|r[|d | }|S )Nr   é   r  éüÿÿÿrf  )r`   rŸ   rl  rm  rß   rU  r   rV  rœ   Úmax_index_name_lengthrý   r,  r   Úmd5_hexÚvalidate_identifierrj  )r¨   r|  r½  rp  Úschema_namerl  Úmax_Ú
index_namerl   rl   rp   rÀ  k  s&   
þ&€z DDLCompiler._prepared_index_namec                 C   s    d| j  |jj¡|  |j¡f S )NzALTER TABLE %s ADD %s)rŸ   r<  rÞ   r`   r¦   ©r¨   r!   rl   rl   rp   Úvisit_add_constraint†  s   
þz DDLCompiler.visit_add_constraintc                 C   s(   d| j  |j¡| j |jjt ¡ ¡f S )NzCOMMENT ON TABLE %s IS %s)rŸ   r<  rÞ   r¹   rK  Úcommentr	   ÚStringrÍ  rl   rl   rp   Úvisit_set_table_commentŒ  s   ÿþz#DDLCompiler.visit_set_table_commentc                 C   ó   d| j  |j¡ S )NzCOMMENT ON TABLE %s IS NULLr·  r¸  rl   rl   rp   Úvisit_drop_table_comment”  s   ÿz$DDLCompiler.visit_drop_table_commentc                 C   s.   d| j j|jddd�| j |jjt ¡ ¡f S )NzCOMMENT ON COLUMN %s IS %sT)Ú	use_tabler*  )rŸ   rt  rÞ   r¹   rK  rÏ  r	   rÐ  rÍ  rl   rl   rp   Úvisit_set_column_comment™  s   ÿÿüz$DDLCompiler.visit_set_column_commentc                 C   s   d| j j|jdd� S )NzCOMMENT ON COLUMN %s IS NULLT)rÔ  )rŸ   rt  rÞ   r¸  rl   rl   rp   Úvisit_drop_column_comment£  s   ÿz%DDLCompiler.visit_drop_column_commentc                 C   sò   d| j  |j¡ }|jjd ur|d|jj 7 }|jjd ur%|d|jj 7 }|jjd ur3|d|jj 7 }|jjd urA|d|jj 7 }|jjd urK|d7 }|jjd urU|d7 }|jj	d urc|d|jj	 7 }|jj
d	u rm|d
7 }|jjd urw|d7 }|S )NzCREATE SEQUENCE %sz INCREMENT BY %dz START WITH %dz MINVALUE %dz MAXVALUE %dz NO MINVALUEz NO MAXVALUEz	 CACHE %dTz ORDERz CYCLE)rŸ   Úformat_sequencerÞ   Ú	incrementÚstartÚminvalueÚmaxvalueÚ
nominvalueÚ
nomaxvalueÚcacherS   Úcycle)r¨   r!   rŠ  rl   rl   rp   Úvisit_create_sequence¨  s,   ÿz!DDLCompiler.visit_create_sequencec                 C   rÒ  )NzDROP SEQUENCE %s)rŸ   r×  rÞ   r¸  rl   rl   rp   Úvisit_drop_sequenceÀ  rÀ   zDDLCompiler.visit_drop_sequencec                 C   s^   |j }|jd ur| j |¡}nd }|d u rt d|j  ¡‚d| j |j j¡||jr+dp,df S )Nz<Can't emit DROP CONSTRAINT for constraint %r; it has no namez#ALTER TABLE %s DROP CONSTRAINT %s%sr�  rÁ   )	rÞ   rß   rŸ   Úformat_constraintr   rb  r<  r`   r‘  )r¨   r’  r    Úformatted_namerl   rl   rp   Úvisit_drop_constraintÃ  s   
ÿÿýz!DDLCompiler.visit_drop_constraintc                 K   sT   | j  |¡d | jjj|j|d� }|  |¡}|d ur!|d| 7 }|js(|d7 }|S )Nr±  )r~  z	 DEFAULT z	 NOT NULL)rŸ   rt  rœ   r  r¦   ræ   Úget_column_default_stringÚnullable)r¨   r   r¿   Úcolspecr(   rl   rl   rp   rª  Õ  s   
ÿÿþÿ
z$DDLCompiler.get_column_specificationc                 C   r¬   ©NrÁ   rl   ©r¨   r`   rl   rl   rp   r™  å  ré   zDDLCompiler.create_table_suffixc                 C   r¬   rè  rl   ré  rl   rl   rp   r¡  è  ré   zDDLCompiler.post_create_tablec                 C   sJ   t |jtjƒr#t |jjtjƒr| j |jjt	j
¡S | jj|jjdd�S d S )NT)r   )rU  Úserver_defaultr   ÚDefaultClauseÚargr   Ústring_typesr¹   rK  r	   r1  r¦   rc  rl   rl   rp   rå  ë  s   
ÿÿz%DDLCompiler.get_column_default_stringc                 C   ó\   d}|j d ur| j |¡}|d ur|d| 7 }|d| jj|jddd� 7 }||  |¡7 }|S ©NrÁ   úCONSTRAINT %s z
CHECK (%s)FTr¿  ©rß   rŸ   râ  r¹   r¦   r¯  Údefine_constraint_deferrability©r¨   r    rŠ  rã  rl   rl   rp   Úvisit_check_constraintø  ó   


ÿz"DDLCompiler.visit_check_constraintc                 C   rî  rï  rñ  ró  rl   rl   rp   Úvisit_column_check_constraint  rõ  z)DDLCompiler.visit_column_check_constraintc                    s†   t |ƒdkrdS d}|jd urˆ j |¡}|d ur|d| 7 }|d7 }|dd ‡ fdd„|jr2|jn|jD ƒ¡ 7 }|ˆ  |¡7 }|S )	Nr   rÁ   rð  zPRIMARY KEY r˜  r}   c                 3   ó   � | ]
}ˆ j  |j¡V  qd S r¯   ©rŸ   rj  rß   r´  r­   rl   rp   r&    s
   € ÿ
ÿz;DDLCompiler.visit_primary_key_constraint.<locals>.<genexpr>)	r,  rß   rŸ   râ  rA   Ú_implicit_generatedÚcolumns_autoinc_firstr|  rò  ró  rl   r­   rp   Úvisit_primary_key_constraint  s   
ÿûz(DDLCompiler.visit_primary_key_constraintc              	      s¼   | j ‰ d}|jd ur| j  |¡}|d ur|d| 7 }t|jƒd jj}|dd ‡ fdd„|jD ƒ¡|  ||ˆ ¡d ‡ fdd„|jD ƒ¡f 7 }||  	|¡7 }||  
|¡7 }||  |¡7 }|S )	NrÁ   rð  r   z"FOREIGN KEY(%s) REFERENCES %s (%s)r}   c                 3   ó   � | ]
}ˆ   |jj¡V  qd S r¯   )rj  Úparentrß   r  r3  rl   rp   r&  -  ó   € 
ÿz;DDLCompiler.visit_foreign_key_constraint.<locals>.<genexpr>c                 3   rü  r¯   )rj  r   rß   r  r3  rl   rp   r&  3  rþ  )rŸ   rß   râ  r  r   r   r`   rA   Údefine_constraint_remote_tableÚdefine_constraint_matchÚdefine_constraint_cascadesrò  )r¨   r    rŠ  rã  Úremote_tablerl   r3  rp   Úvisit_foreign_key_constraint$  s,   
ÿÿÿùz(DDLCompiler.visit_foreign_key_constraintc                 C   s
   |  |¡S )z=Format the remote table clause of a CREATE CONSTRAINT clause.)r<  )r¨   r    r`   rŸ   rl   rl   rp   rÿ  <  rÃ   z*DDLCompiler.define_constraint_remote_tablec                    sh   t |ƒdkrdS d}|jd urˆ j |¡}|d| 7 }|dd ‡ fdd„|D ƒ¡ 7 }|ˆ  |¡7 }|S )Nr   rÁ   rð  zUNIQUE (%s)r}   c                 3   r÷  r¯   rø  r´  r­   rl   rp   r&  I  rØ  z6DDLCompiler.visit_unique_constraint.<locals>.<genexpr>)r,  rß   rŸ   râ  rA   rò  ró  rl   r­   rp   Úvisit_unique_constraintA  s   
ÿz#DDLCompiler.visit_unique_constraintc                 C   s8   d}|j d ur|d|j  7 }|jd ur|d|j 7 }|S )NrÁ   z ON DELETE %sz ON UPDATE %s)ÚondeleteÚonupdate©r¨   r    rŠ  rl   rl   rp   r  N  s   

z&DDLCompiler.define_constraint_cascadesc                 C   sB   d}|j d ur|j r|d7 }n|d7 }|jd ur|d|j 7 }|S )NrÁ   z DEFERRABLEz NOT DEFERRABLEz INITIALLY %s)r)   r;   r  rl   rl   rp   rò  V  s   


z+DDLCompiler.define_constraint_deferrabilityc                 C   s    d}|j d ur|d|j  7 }|S )NrÁ   z	 MATCH %s)Úmatchr  rl   rl   rp   r   a  s   
z#DDLCompiler.define_constraint_matchr¯   rl  )FT))rÎ   rÏ   rÐ   r   rr  r¹   r  rÅ   r�  r�  r“  r§  r¬  rŸ  r¹  rº  r»  rÃ  rÄ  rÀ  rÎ  rÑ  rÓ  rÕ  rÖ  rà  rá  rä  rª  r™  r¡  rå  rô  rö  rû  r  rÿ  r  r  rò  r   rl   rl   rl   rp   r‚  ¯
  sR    



1
ÿ)
ÿ

r‚  c                   @   s\  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGdH„ Z&dIdJ„ Z'dKdL„ Z(dMdN„ Z)dOdP„ Z*dQdR„ Z+dSdT„ Z,dUS )VÚGenericTypeCompilerc                 K   r¬   )NÚFLOATrl   rØ   rl   rl   rp   Úvisit_FLOATi  ré   zGenericTypeCompiler.visit_FLOATc                 K   r¬   )NÚREALrl   rØ   rl   rl   rp   Ú
visit_REALl  ré   zGenericTypeCompiler.visit_REALc                 K   ó8   |j d u rdS |jd u rdd|j i S d|j |jdœ S )NÚNUMERICzNUMERIC(%(precision)s)Ú	precisionz!NUMERIC(%(precision)s, %(scale)s)©r  Úscaler  rØ   rl   rl   rp   Úvisit_NUMERICo  ó   

þz!GenericTypeCompiler.visit_NUMERICc                 K   r  )NÚDECIMALzDECIMAL(%(precision)s)r  z!DECIMAL(%(precision)s, %(scale)s)r  r  rØ   rl   rl   rp   Úvisit_DECIMALz  r  z!GenericTypeCompiler.visit_DECIMALc                 K   r¬   )NÚINTEGERrl   rØ   rl   rl   rp   Úvisit_INTEGER…  ré   z!GenericTypeCompiler.visit_INTEGERc                 K   r¬   )NÚSMALLINTrl   rØ   rl   rl   rp   Úvisit_SMALLINTˆ  ré   z"GenericTypeCompiler.visit_SMALLINTc                 K   r¬   )NÚBIGINTrl   rØ   rl   rl   rp   Úvisit_BIGINT‹  ré   z GenericTypeCompiler.visit_BIGINTc                 K   r¬   )NÚ	TIMESTAMPrl   rØ   rl   rl   rp   Úvisit_TIMESTAMPŽ  ré   z#GenericTypeCompiler.visit_TIMESTAMPc                 K   r¬   )NÚDATETIMErl   rØ   rl   rl   rp   Úvisit_DATETIME‘  ré   z"GenericTypeCompiler.visit_DATETIMEc                 K   r¬   )NÚDATErl   rØ   rl   rl   rp   Ú
visit_DATE”  ré   zGenericTypeCompiler.visit_DATEc                 K   r¬   )NÚTIMErl   rØ   rl   rl   rp   Ú
visit_TIME—  ré   zGenericTypeCompiler.visit_TIMEc                 K   r¬   )NÚCLOBrl   rØ   rl   rl   rp   Ú
visit_CLOBš  ré   zGenericTypeCompiler.visit_CLOBc                 K   r¬   )NÚNCLOBrl   rØ   rl   rl   rp   Úvisit_NCLOB�  ré   zGenericTypeCompiler.visit_NCLOBc                 C   s0   |}|j r|d|j  7 }|jr|d|j 7 }|S )Nú(%d)z COLLATE "%s")Úlengthru  )r¨   rÙ   rß   rŠ  rl   rl   rp   Ú_render_string_type   s   z'GenericTypeCompiler._render_string_typec                 K   ó   |   |d¡S )NÚCHAR©r+  rØ   rl   rl   rp   Ú
visit_CHAR©  rî  zGenericTypeCompiler.visit_CHARc                 K   r,  )NÚNCHARr.  rØ   rl   rl   rp   Úvisit_NCHAR¬  rî  zGenericTypeCompiler.visit_NCHARc                 K   r,  )NÚVARCHARr.  rØ   rl   rl   rp   Úvisit_VARCHAR¯  rî  z!GenericTypeCompiler.visit_VARCHARc                 K   r,  )NÚNVARCHARr.  rØ   rl   rl   rp   Úvisit_NVARCHAR²  rî  z"GenericTypeCompiler.visit_NVARCHARc                 K   r,  )NÚTEXTr.  rØ   rl   rl   rp   Ú
visit_TEXTµ  rî  zGenericTypeCompiler.visit_TEXTc                 K   r¬   )NÚBLOBrl   rØ   rl   rl   rp   Ú
visit_BLOB¸  ré   zGenericTypeCompiler.visit_BLOBc                 K   ó   d|j r	d|j  p
d S )NÚBINARYr)  rÁ   ©r*  rØ   rl   rl   rp   Úvisit_BINARY»  r/  z GenericTypeCompiler.visit_BINARYc                 K   r:  )NÚ	VARBINARYr)  rÁ   r<  rØ   rl   rl   rp   Úvisit_VARBINARY¾  r/  z#GenericTypeCompiler.visit_VARBINARYc                 K   r¬   )NÚBOOLEANrl   rØ   rl   rl   rp   Úvisit_BOOLEANÁ  ré   z!GenericTypeCompiler.visit_BOOLEANc                 K   ó   | j |fi |¤ŽS r¯   )r9  rØ   rl   rl   rp   Úvisit_large_binaryÄ  rÀ   z&GenericTypeCompiler.visit_large_binaryc                 K   rB  r¯   )rA  rØ   rl   rl   rp   Úvisit_booleanÇ  rÀ   z!GenericTypeCompiler.visit_booleanc                 K   rB  r¯   )r$  rØ   rl   rl   rp   Ú
visit_timeÊ  rÀ   zGenericTypeCompiler.visit_timec                 K   rB  r¯   )r   rØ   rl   rl   rp   Úvisit_datetimeÍ  rÀ   z"GenericTypeCompiler.visit_datetimec                 K   rB  r¯   )r"  rØ   rl   rl   rp   Ú
visit_dateÐ  rÀ   zGenericTypeCompiler.visit_datec                 K   rB  r¯   )r  rØ   rl   rl   rp   Úvisit_big_integerÓ  rÀ   z%GenericTypeCompiler.visit_big_integerc                 K   rB  r¯   )r  rØ   rl   rl   rp   Úvisit_small_integerÖ  rÀ   z'GenericTypeCompiler.visit_small_integerc                 K   rB  r¯   )r  rØ   rl   rl   rp   Úvisit_integerÙ  rÀ   z!GenericTypeCompiler.visit_integerc                 K   rB  r¯   )r  rØ   rl   rl   rp   Ú
visit_realÜ  rÀ   zGenericTypeCompiler.visit_realc                 K   rB  r¯   )r  rØ   rl   rl   rp   Úvisit_floatß  rÀ   zGenericTypeCompiler.visit_floatc                 K   rB  r¯   )r  rØ   rl   rl   rp   Úvisit_numericâ  rÀ   z!GenericTypeCompiler.visit_numericc                 K   rB  r¯   ©r3  rØ   rl   rl   rp   Úvisit_stringå  rÀ   z GenericTypeCompiler.visit_stringc                 K   rB  r¯   rN  rØ   rl   rl   rp   Úvisit_unicodeè  rÀ   z!GenericTypeCompiler.visit_unicodec                 K   rB  r¯   ©r7  rØ   rl   rl   rp   Ú
visit_textë  rÀ   zGenericTypeCompiler.visit_textc                 K   rB  r¯   rQ  rØ   rl   rl   rp   Úvisit_unicode_textî  rÀ   z&GenericTypeCompiler.visit_unicode_textc                 K   rB  r¯   rN  rØ   rl   rl   rp   Ú
visit_enumñ  rÀ   zGenericTypeCompiler.visit_enumc                 K   s   t  d| ¡‚)NzKCan't generate DDL for %r; did you forget to specify a type on this Column?ra  rØ   rl   rl   rp   r¨  ô  s
   þÿzGenericTypeCompiler.visit_nullc                 K   s   | j | | j¡fi |¤ŽS r¯   )r¦   Útype_enginerœ   rØ   rl   rl   rp   Úvisit_type_decoratorû  s   z(GenericTypeCompiler.visit_type_decoratorc                 K   s   |j di |¤ŽS )Nrl   )Úget_col_specrØ   rl   rl   rp   Úvisit_user_definedþ  r_  z&GenericTypeCompiler.visit_user_definedN)-rÎ   rÏ   rÐ   r  r  r  r  r  r  r  r  r   r"  r$  r&  r(  r+  r/  r1  r3  r5  r7  r9  r=  r?  rA  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rO  rP  rR  rS  rT  r¨  rV  rX  rl   rl   rl   rp   r	  h  sV    	r	  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚStrSQLTypeCompilerc                 C   s   |  d¡r| jS t|ƒ‚)NÚvisit_)Ú
startswithÚ_visit_unknownÚAttributeError)r¨   r$  rl   rl   rp   Ú__getattr__  s   
zStrSQLTypeCompiler.__getattr__c                 K   s   d|j j S )Nz%s)rå  rÎ   rØ   rl   rl   rp   r\  	  rî  z!StrSQLTypeCompiler._visit_unknownN)rÎ   rÏ   rÐ   r^  r\  rl   rl   rl   rp   rY    s    rY  c                   @   sþ   e Zd ZdZeZeZeZ	e
 d¡Z					d/dd„Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zd0dd„Zd0dd„Zdd„ Zd1dd„Zd0dd„Zd0dd„Zd0dd„Ze d ¡d!d"„ ƒZd2d#d$„Zd0d%d&„Z				d3d'd(„Zd1d)d*„Z ej!d+d,„ ƒZ"d-d.„ Z#dS )4ÚIdentifierPreparerz@Handle quoting and case-folding of identifiers based on options.Nú"TFc                 C   sN   || _ || _|p
| j| _|| _| jd | _|| _|| _i | _| j jdv | _	dS )as  Construct a new ``IdentifierPreparer`` object.

        initial_quote
          Character that begins a delimited identifier.

        final_quote
          Character that ends a delimited identifier. Defaults to
          `initial_quote`.

        omit_schema
          Prevent prepending schema name. Useful for databases that do
          not support schemae.
        r   )rx   rv   N)
rœ   Úinitial_quoteÚfinal_quoteÚescape_quoteÚescape_to_quoteÚomit_schemaÚquote_case_sensitive_collationsÚ_stringsr÷   r‡  )r¨   rœ   ra  rb  rc  rf  re  rl   rl   rp   r«     s   zIdentifierPreparer.__init__c                 C   s,   | j  | j ¡}|j | j¡ t |¡|_|S r¯   )rå  Ú__new__Ú__dict__r©  r   Ú_schema_getterrl  )r¨   r©   Úpreprl   rl   rp   r    =  s   z)IdentifierPreparer._with_schema_translatec                 C   s&   |  | j| j¡}| jr|  dd¡}|S )z€Escape an identifier.

        Subclasses should override this to provide database-dependent
        escaping behavior.
        r„  r…  )rˆ  rc  rd  r‡  ©r¨   r%  rl   rl   rp   Ú_escape_identifierC  s   z%IdentifierPreparer._escape_identifierc                 C   s   |  | j| j¡S )z±Canonicalize an escaped identifier.

        Subclasses should override this to provide database-dependent
        unescaping behavior that reverses _escape_identifier.
        )rˆ  rd  rc  rl  rl   rl   rp   Ú_unescape_identifierO  s   z'IdentifierPreparer._unescape_identifierc                 C   s   | j |  |¡ | j S )z~Quote an identifier.

        Subclasses should override this to provide database-dependent
        quoting behavior.
        )ra  rm  rb  rl  rl   rl   rp   Úquote_identifierX  s   ÿþÿz#IdentifierPreparer.quote_identifierc                 C   s<   |  ¡ }|| jv p|d | jv p| j t |¡¡ p||kS )z5Return True if the given identifier requires quoting.r   )rã  Úreserved_wordsÚillegal_initial_charactersÚlegal_charactersr  r   Ú	text_type)r¨   r%  Úlc_valuerl   rl   rp   r�  e  s   
ÿþüz#IdentifierPreparer._requires_quotesc                 C   ó   |   ||¡S )aê  Conditionally quote a schema name.

        The name is quoted if it is a reserved word, contains quote-necessary
        characters, or is an instance of :class:`.quoted_name` which includes
        ``quote`` set to ``True``.

        Subclasses can override this to provide database-dependent
        quoting behavior for schema names.

        :param schema: string schema name
        :param force: this parameter is no longer used.

         .. deprecated:: 0.9

            The :paramref:`.IdentifierPreparer.force` parameter is deprecated
            and will be removed in a future release.  Quoting preference
            is now intrinsic to the string being quoted by making use of the
            :class:`.quoted_name` class.

        ©rj  )r¨   r   Úforcerl   rl   rp   rm  o  s   zIdentifierPreparer.quote_schemac                 C   sj   t |ddƒ}|du r,|| jv r| j| S |  |¡r"|  |¡| j|< n|| j|< | j| S |r3|  |¡S |S )aõ  Conditionally quote an identfier.

        The identifier is quoted if it is a reserved word, contains
        quote-necessary characters, or is an instance of
        :class:`.quoted_name` which includes ``quote`` set to ``True``.

        Subclasses can override this to provide database-dependent
        quoting behavior for identifier names.

        :param ident: string identifier
        :param force: this parameter is no longer used.

         .. deprecated:: 0.9

             The :paramref:`.IdentifierPreparer.force` parameter is deprecated
             and will be removed in a future release.  Quoting preference
             is now intrinsic to the string being quoted by making use of the
             :class:`.quoted_name` class.

        rj  N)rï   rg  r�  ro  )r¨   rl  rw  rl   rl   rp   rj  †  s   





zIdentifierPreparer.quotec                 C   s   | j r|  |¡S |S r¯   )rf  rj  )r¨   Úcollation_namerl   rl   rp   rt  ¬  s   
z#IdentifierPreparer.format_collationc                 C   s>   |   |j¡}|  |¡}| js|r|d ur|  |¡d | }|S )Nrf  )rj  rß   rl  re  rm  )r¨   rë  r*  rß   rp  rl   rl   rp   r×  ²  s   
ÿþz"IdentifierPreparer.format_sequencec                 C   ó   |   |p|j¡S r¯   ©rj  rß   )r¨   rÝ   rß   rl   rl   rp   rZ  ¿  r_  zIdentifierPreparer.format_labelc                 C   ry  r¯   rz  )r¨   rg  rß   rl   rl   rp   ry  Â  r_  zIdentifierPreparer.format_aliasc                 C   s"   |p|j }|  |¡r|  |¡}|S r¯   )rl  r�  ro  )r¨   Ú	savepointrß   rl  rl   rl   rp   re  Å  s   


z#IdentifierPreparer.format_savepointzsqlalchemy.sql.namingc                 C   sH   t |jtjƒr| ||j¡}|r|  |¡S t |jtjƒrd S |  |j¡S r¯   )rU  rß   r   Ú_defer_nameÚ_constraint_name_for_tabler`   rj  Ú_defer_none_name)r¨   Únamingr    rß   rl   rl   rp   râ  Î  s   ÿ
z$IdentifierPreparer.format_constraintc                 C   sF   |du r|j }|  |¡}|  |¡}| js!|r!|r!|  |¡d | }|S )z'Prepare a quoted table and schema name.Nrf  )rß   rj  rl  re  rm  )r¨   r`   r*  rß   r:  rp  rl   rl   rp   r<  Ú  s   

zIdentifierPreparer.format_tablec                 C   ru  )zPrepare a quoted schema name.rv  )r¨   rß   rj  rl   rl   rp   rŽ  ç  s   z IdentifierPreparer.format_schemac                 C   sj   |du r|j }t|ddƒs$|r| j|j||d�d |  |¡ S |  |¡S |r3| j|j||d�d | S |S )zPrepare a quoted column name.Nrh  F)r*  rß   rf  )rß   rï   r<  r`   rj  )r¨   r   rÔ  rß   Ú
table_namer*  rl   rl   rp   rt  ì  s.   
ÿýüÿ
ÿýüÿz IdentifierPreparer.format_columnc                 C   s@   |   |¡}| js|r|r|  |¡| j|dd�fS | j|dd�fS )z(Format table name and schema as a tuple.Fr¾  )rl  re  rm  r<  )r¨   r`   r*  rp  rl   rl   rp   rˆ    s   
þz#IdentifierPreparer.format_table_seqc                 C   s@   dd„ | j | j|  | j¡fD ƒ\}}}t d|||dœ ¡}|S )Nc                 S   s   g | ]}t  |¡‘qS rl   )r"  rG  r²  rl   rl   rp   rÑ  %  ó    ÿÿz5IdentifierPreparer._r_identifiers.<locals>.<listcomp>zM(?:(?:%(initial)s((?:%(escaped)s|[^%(final)s])+)%(final)s|([^\.]+))(?=\.|$))+)ÚinitialÚfinalÚescaped)ra  rb  rm  r"  r®   )r¨   r‚  rƒ  Úescaped_finalÚrrl   rl   rp   Ú_r_identifiers#  s   
ýþ
ýÿz!IdentifierPreparer._r_identifiersc                    s(   ˆ j }‡ fdd„dd„ | |¡D ƒD ƒS )z:Unpack 'schema.table.column'-like strings into components.c                    s   g | ]}ˆ   |¡‘qS rl   )rn  )rn   rò  r­   rl   rp   rÑ  9  r�  z;IdentifierPreparer.unformat_identifiers.<locals>.<listcomp>c                 S   s   g | ]\}}|p	|‘qS rl   rl   )rn   ÚaÚbrl   rl   rp   rÑ  ;  rÝ  )r‡  Úfindall)r¨   Úidentifiersr†  rl   r­   rp   Úunformat_identifiers5  s   
þz'IdentifierPreparer.unformat_identifiers)r`  Nr`  TFr¯   )T)TN)FNNF)$rÎ   rÏ   rÐ   rÑ   ÚRESERVED_WORDSrp  ÚLEGAL_CHARACTERSrr  ÚILLEGAL_INITIAL_CHARACTERSrq  r   rj  rl  r«   r    rm  rn  ro  r�  rm  rj  rt  r×  rZ  ry  re  r   rs  râ  r<  rŽ  rt  rˆ  rr  r‡  rŒ  rl   rl   rl   rp   r_    sJ    

ù$	


&



	



ú
&
r_  )frÑ   rp  r   r"  rÁ   r   r   r   r   r   r   r	   r
   r   r   r\   r�  r®   ÚIrŽ  Úrangere   r�  ÚUNICODEr”  r“  rù   Úand_Úor_ÚaddÚmulr#  ÚdivÚmodÚtruedivÚnegÚltÚleÚneÚgtÚgeÚeqÚis_distinct_fromÚisnot_distinct_fromÚ	concat_opr  Únotmatch_opÚin_opÚnotin_opÚcomma_opr	  rY  Úis_Úisnotr   ÚexistsÚdistinct_opÚinvÚany_opÚall_opÚdesc_opÚasc_opÚnullsfirst_opÚnullslast_oprX  Úcoalescer#   r%   r&   r'   rF   rG   Úrandomr†   r[   rg   ÚcubeÚrollupÚgrouping_setsrä  rm  r|  r˜   Ú	UNION_ALLr™   Ú
EXCEPT_ALLrš   ÚINTERSECT_ALLrn  Úobjectr›   Úwith_metaclassÚEnsureKWArgTyperÖ   Ú	VisitablerÜ   rì   ru  r‚  r	  rY  r_  rl   rl   rl   rp   Ú<module>   sR  ÿcû	þýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãá à!ß"Þ#Ý%Û&Ø,òñú
                  d:   < 