B
    .²ô`ö ã            _   @   s(  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dddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdlg^ƒZe dmej¡Ze dnej¡Zdodp„ eddqƒD ƒ drg¡Ze dsej¡Ze dsej¡Ze dtej¡Ze duej¡Ze dvej¡Zdwdxdydzd{d|œZejd}ej d~ej!dej"d€ej#de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j0dej1dŽej2dej3dej4d‘ej5d’ej6d“ej7d”ej8d•ej9d–ej:d—ej;d˜ej<d™ej=dšej>d›ej?dœej@dejAdžejBdŸejCd i%ZDejEd¡ejFd¢ejGd£ejHd¤ejId¥ejJd¦ejKd§ejLd¨ejMd©ejNdªejOd«ejPd¬ejQd­ejRd®iZSd¯d°d±d²d³d´dµd¶d·d¸d¹dºd»d¼d½d¾œZTe
jUjVd¿e
jUjWdÀe
jUjXdÁe
jUjYdÂe
jUjZdÃe
jUj[dÄiZ\G dÅdÆ„ dÆe]ƒZ^G dÇdÈ„ dÈe _ej`e]¡ƒZaG dÉdÊ„ dÊejbƒZcG dËdÌ„ dÌedƒZeG dÍdÎ„ dÎe^ƒZfG dÏdÐ„ dÐefƒZgG dÑdÒ„ dÒe^ƒZhG dÓdÔ„ dÔeaƒZiG dÕdÖ„ dÖeiƒZjG d×dØ„ dØe]ƒZkdS )Ùa]  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ÚallZanalyseZanalyzeÚandÚanyÚarrayÚasZascZ
asymmetricÚauthorizationZbetweenÚbinaryZbothZcaseÚcastÚcheckÚcollateÚcolumnÚ
constraintÚcreateZcrossÚcurrent_dateZcurrent_roleÚcurrent_timeÚcurrent_timestampÚcurrent_userÚdefaultÚ
deferrableÚdescZdistinctZdoÚelseÚendÚexceptÚfalseÚforZforeignÚfreezeÚfromÚfullZgrantÚgroupZhavingZilikeÚinÚ	initiallyÚinnerZ	intersectZintoÚisZisnullÚjoinÚleadingÚleftÚlikeÚlimitÚ	localtimeÚlocaltimestampZnaturalÚnewÚnotZnotnullÚnullÚoffÚoffsetÚoldÚonÚonlyÚorÚorderÚouterÚoverlapsZplacingZprimaryZ
referencesÚrightÚselectÚsession_userÚsetZsimilarZsomeÚ	symmetricÚtableZthenÚtoZtrailingÚtrueÚunionÚuniqueÚuserZusingÚverboseÚwhenÚwherez^[A-Z0-9_$]+$z^[A-Z0-9_ $]+$c             C   s   h | ]}t |ƒ’qS © )Ústr)Ú.0ÚxrP   rP   úF/home/dcms/DCMS/lib/python3.7/site-packages/sqlalchemy/sql/compiler.pyú	<setcomp>   s    rU   é
   ú$z5^(?:RESTRICT|CASCADE|SET NULL|NO ACTION|SET DEFAULT)$z^(?:DEFERRED|IMMEDIATE)$z%(?<![:\w\$\x5c]):([\w\$]+)(?![:\w\$])z\x5c(:[\w\$]*)(?![:\w\$])z%%(%(name)s)sú?z%%sz:[_POSITION]z	:%(name)s)ÚpyformatZqmarkÚformatÚnumericÚnamedz AND z OR z + 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, z FROM z AS z IS z IS NOT z	 COLLATE zEXISTS z	DISTINCT zNOT zANY zALL z DESCz ASCz NULLS FIRSTz NULLS LASTÚcoalesceZCURRENT_DATEZCURRENT_TIMEZCURRENT_TIMESTAMPZCURRENT_USERZ	LOCALTIMEZLOCALTIMESTAMPÚrandomÚsysdateZSESSION_USERÚUSERZCUBEZROLLUPzGROUPING SETSÚmonthÚdayÚyearÚsecondÚhourÚdoyÚminuteÚquarterÚdowÚweekÚepochÚmillisecondsÚmicrosecondsÚtimezone_hourÚtimezone_minute)rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   ÚUNIONz	UNION ALLÚEXCEPTz
EXCEPT ALLÚ	INTERSECTzINTERSECT ALLc               @   s’   e Zd 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   sh   || _ || _| j j| _|| _|r.| j |¡| _|dk	rd|| _|j| _| jrR|j	| _
| j| jf|Ž| _dS )a|  Construct a new :class:`.Compiled` object.

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

        :param statement: :class:`_expression.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ÚbindZidentifier_preparerÚpreparerÚschema_translate_mapÚ_with_schema_translateÚ	statementZsupports_executionÚcan_executeÚ_execution_optionsÚexecution_optionsÚprocessÚstring)Úselfru   rz   rv   rx   Úcompile_kwargsrP   rP   rT   Ú__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   s   dS )z;Produce the internal string representation of this element.NrP   )r€   rP   rP   rT   ÚcompileD  s    	zCompiled.compilec             C   s$   | j r| | ||¡S t | j¡‚d S )N)r{   Ú_execute_compiledr   ZObjectNotExecutableErrorrz   )r€   Ú
connectionÚmultiparamsÚparamsrP   rP   rT   Ú_execute_on_connectionO  s    zCompiled._execute_on_connectionc             C   s
   t ƒ ‚dS )zReturn a Compiled that is capable of processing SQL expressions.

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

        N)ÚNotImplementedError)r€   rP   rP   rT   Úsql_compilerU  s    zCompiled.sql_compilerc             K   s   |j | f|ŽS )N)Ú_compiler_dispatch)r€   ÚobjÚkwargsrP   rP   rT   r~   _  s    zCompiled.processc             C   s
   | j pdS )z3Return the string text of the generated SQL or DDL.Ú )r   )r€   rP   rP   rT   Ú__str__b  s    zCompiled.__str__c             C   s
   t ƒ ‚dS )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.
        N)r‰   )r€   r‡   rP   rP   rT   Úconstruct_paramsg  s    zCompiled.construct_paramsc             C   s   |   ¡ S )z0Return the bind params for this compiled object.)r   )r€   rP   rP   rT   r‡   q  s    zCompiled.paramsc             O   s*   | j }|dkrtjddd‚| | ||¡S )zExecute this compiled object.Nz>This Compiled object is not bound to any Engine or Connection.Z2afi)Úcode)rv   r   ZUnboundExecutionErrorr„   )r€   r†   r‡   ÚerP   rP   rT   Úexecutev  s    zCompiled.executec             O   s   | j ||Ž ¡ S )zJExecute this compiled object and return the result's
        scalar value.)r“   Úscalar)r€   r†   r‡   rP   rP   rT   r”   ‚  s    zCompiled.scalar)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z_cached_metadatarx   r   Úimmutabledictr}   r‚   Ú
deprecatedrƒ   rˆ   ÚpropertyrŠ   r~   r   r   r‡   r“   r”   rP   rP   rP   rT   rt   ü   s$   
*	


rt   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 )N)ru   )r€   ru   rP   rP   rT   r‚   Ž  s    zTypeCompiler.__init__c             K   s   |j | f|ŽS )N)r‹   )r€   Útype_ÚkwrP   rP   rT   r~   ‘  s    zTypeCompiler.processN)r•   r–   r—   r˜   Zensure_kwargr‚   r~   rP   rP   rP   rT   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ÚnamerP   c             C   s   || _ || _|f| | _d S )N)r¡   r¢   Ú
_alt_names)r€   Úcolr¢   Ú	alt_namesrP   rP   rT   r‚   œ  s    z_CompileLabel.__init__c             C   s   | j jS )N)r¡   Ú	proxy_set)r€   rP   rP   rT   r¦   ¡  s    z_CompileLabel.proxy_setc             C   s   | j jS )N)r¡   Útype)r€   rP   rP   rT   r§   ¥  s    z_CompileLabel.typec             K   s   | S )NrP   )r€   rž   rP   rP   rT   Ú
self_group©  s    z_CompileLabel.self_groupN)rP   )r•   r–   r—   r˜   Ú__visit_name__Ú	__slots__r‚   r›   r¦   r§   r¨   rP   rP   rP   rT   rŸ   •  s   
rŸ   c               @   s   e Zd ZdZdd„ ZdS )Úprefix_anon_mapac  A map that creates new keys for missing key access.
    Considers keys of the form "<ident> <name>" to produce
    new symbols "<name>_<index>", where "index" is an incrementing integer
    corresponding to <name>.
    Inlines the approach taken by :class:`sqlalchemy.util.PopulateDict` which
    is otherwise usually used for this type of operation.
    c             C   sD   |  dd¡\}}|  |d¡}|d | |< |d t|ƒ }|| |< |S )Nú r   Ú_)ÚsplitÚgetrQ   )r€   ÚkeyÚidentZderivedZanonymous_counterÚvaluerP   rP   rT   Ú__missing__¶  s    zprefix_anon_map.__missing__N)r•   r–   r—   r˜   r³   rP   rP   rP   rT   r«   ­  s   r«   c               @   sú  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d ZZddd„Ze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,„Z0d-d.„ Z1d/d0„ Z2d1d2„ Z3d3d4„ Z4d5d6„ Z5d7d8„ Z6d9d:„ Z7dd;d<„Z8d=d>„ Z9d?d@„ Z:dAdB„ Z;dCdD„ Z<dEdF„ Z=dGdH„ Z>dIdJ„ Z?dKdL„ Z@dMdN„ ZAdOdP„ ZBdQdR„ ZCdSdT„ ZDddUdV„ZEdWdX„ ZFdYdZ„ ZGd[d\„ ZHdd^d_„ZId`da„ ZJdbdc„ ZKddde„ ZLdfdg„ ZMdhdi„ ZNdjdk„ ZOdldm„ ZPdndo„ ZQdpdq„ ZRddrds„ZSdtdu„ ZTdvdw„ ZUdxdy„ ZVdzd{„ ZWd|d}„ ZXdd~d„ZYd€d„ ZZd‚dƒ„ Z[ej"d„d…„ ƒZ\d†d‡„ Z]dˆd‰„ Z^dŠd‹„ Z_dŒd„ Z`dŽd„ Zadd‘„ Zbd’d“„ Zcd”d•„ Zdd–d—„ Zed˜d™„ Zfdšd›„ Zgdœd„ ZhddždŸ„Zid d¡„ Zjd¢d£„ Zkd¤d¥„ Zld¦d§„ Zmd¨d©„ Znddªd«„Zodd¬d­„Zpdd®d¯„Zqd°d±„ Zrdd²d³„Zsd´dµ„ Ztd¶d·„ Zudd¸d¹„Zvdºd»„ Zwd¼d½„ Zxd¾d¿„ ZydÀdÁ„ ZzdÂdÃ„ Z{dÄdÅ„ Z|dÆdÇ„ Z}e ~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ã„ Zdädå„ ZŽddædç„Zddèdé„Zdê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„ ZdS (  ÚSQLCompilerz~Default implementation of :class:`.Compiled`.

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

    FNTrP   c             K   sÌ   || _ |pt|ddƒ| _i | _t ¡ | _g | _g | _|j	| _	| j	rTg | _
|jdk| _t|j | _d| _|jpp|j| _tƒ | _i | _tj| ||f|Ž | js¦| js¦| jr´|jr´|j| _| j	rÈ| jrÈ|  ¡  dS )a  Construct a new :class:`.SQLCompiler` object.

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

        :param statement: :class:`_expression.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.

        ÚinlineFr[   N)Úcolumn_keysÚgetattrrµ   Úbindsr   Zcolumn_dictÚ
bind_namesÚstackÚ_result_columnsÚ
positionalÚpositiontupÚ
paramstyleÚ_numeric_bindsÚBIND_TEMPLATESÚbindtemplateÚctesÚlabel_lengthÚmax_identifier_lengthr«   Úanon_mapÚtruncated_namesrt   r‚   ÚisinsertÚisupdateÚisdeleteÚ
_returningÚ	returningÚ_apply_numbered_params)r€   ru   rz   r¶   rµ   r   rP   rP   rT   r‚     s*    
zSQLCompiler.__init__c          
   C   sH   y| j d d S  tk
rB } ztjtdƒ|d W dd}~X Y nX dS )a±  Return the current 'executable' that is being compiled.

        This is currently the :class:`_sql.Select`, :class:`_sql.Insert`,
        :class:`_sql.Update`, :class:`_sql.Delete`,
        :class:`_sql.CompoundSelect` object that is being compiled.
        Specifically it's assigned to the ``self.stack`` list of elements.

        When a statement like the above is being compiled, it normally
        is also assigned to the ``.statement`` attribute of the
        :class:`_sql.Compiler` object.   However, all SQL constructs are
        ultimately nestable, and this attribute should never be consulted
        by a ``visit_`` method, as it is not guaranteed to be assigned
        nor guaranteed to correspond to the current statement being compiled.

        .. versionadded:: 1.3.21

            For compatibility with previous versions, use the following
            recipe::

                statement = getattr(self, "current_executable", False)
                if statement is False:
                    statement = self.stack[-1]["selectable"]

            For versions 1.4 and above, ensure only .current_executable
            is used; the format of "self.stack" may change.


        éÿÿÿÿr   z$Compiler does not have a stack entry)Úreplace_contextN)rº   Ú
IndexErrorr   Úraise_)r€   ZierP   rP   rT   Úcurrent_executableZ  s    zSQLCompiler.current_executablec             C   s   t | j| j ƒS )N)ÚlistÚinsert_prefetchÚupdate_prefetch)r€   rP   rP   rT   Úprefetch€  s    zSQLCompiler.prefetchc             C   s&   t  ¡ | _i | _d| _| jr"i | _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_positional)r€   rP   rP   rT   Ú_init_cte_state„  s
    
zSQLCompiler._init_cte_statec          	   c   sp   | j | j }}g d | _ | _z0| jr8| jd }d|d< nd}| j | jfV  W d|r\| d¡ || | _ | _X dS )z;special API to support the use case of 'nested result sets'FrÍ   TÚneed_result_map_for_nestedN)r»   Ú_ordered_columnsrº   Úpop)r€   Zresult_columnsZordered_columnsÚentryrP   rP   rT   Ú_nested_result’  s    



zSQLCompiler._nested_resultc                s(   t  d¡‰ t d‡ fdd„| j¡| _d S )Nr   z\[_POSITION\]c                s   t t ˆ ¡ƒS )N)rQ   r   Únext)Úm)ÚposcountrP   rT   Ú<lambda>­  ó    z4SQLCompiler._apply_numbered_params.<locals>.<lambda>)Ú	itertoolsÚcountÚreÚsubr   )r€   rP   )râ   rT   rÌ   ª  s    
z"SQLCompiler._apply_numbered_paramsc                s"   t dd„ ‡ fdd„ˆ jD ƒD ƒƒS )Nc             s   s"   | ]\}}|d k	r||fV  qd S )NrP   )rR   r°   r²   rP   rP   rT   ú	<genexpr>³  s   z/SQLCompiler._bind_processors.<locals>.<genexpr>c             3   s&   | ]}ˆ j | |j ˆ j¡fV  qd S )N)r¹   r§   Z_cached_bind_processorru   )rR   Ú	bindparam)r€   rP   rT   ré   µ  s   )Údictr¹   )r€   rP   )r€   rT   Ú_bind_processors°  s    
zSQLCompiler._bind_processorsc             C   s   t | jƒdkS )Nr   )Úlenrº   )r€   rP   rP   rT   Úis_subquery¾  s    zSQLCompiler.is_subqueryc             C   s   | S )NrP   )r€   rP   rP   rT   rŠ   Á  s    zSQLCompiler.sql_compilerc             C   s2  |r°i }x¢| j D ]˜}| j | }|j|kr8||j ||< q||krN|| ||< q|rŒ|jrŒ|rvtjd|j|f dd‚q¨tjd|j dd‚q|jrž|j||< q|j||< qW |S i }xt| j D ]j}|rü|jrü|rètjd|j|f dd‚ntjd|j dd‚|jr|j|| j | < q¼|j|| j | < q¼W |S dS )z5return a dictionary of bind parameter keys and valuesz@A value is required for bind parameter %r, in parameter group %dZcd3x)r‘   z)A value is required for bind parameter %rN)r¹   r°   Úrequiredr   ZInvalidRequestErrorÚcallableÚeffective_valuer²   )r€   r‡   Z_group_numberÚ_checkÚpdrê   r¢   rP   rP   rT   r   Å  sL    








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)rò   )r   )r€   rP   rP   rT   r‡   ý  s    zSQLCompiler.paramszsqlalchemy.engine.resultc             C   s   |j  | j¡S )z(utility method used for unit tests only.)ZResultMetaDataÚ_create_result_mapr»   )r€   ÚresultrP   rP   rT   rô     s    zSQLCompiler._create_result_mapc             C   s   dS )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Ž   rP   )r€   rP   rP   rT   Údefault_from  s    zSQLCompiler.default_fromc             K   s   d|j j| f|Ž d S )Nú(ú))r¡   r‹   )r€   ÚgroupingÚasfromr   rP   rP   rT   Úvisit_grouping  s    zSQLCompiler.visit_groupingc       
      K   s„   | j rl| jjrl| j d d }|j\}}}|r2|}n|}|jj}	|	d k	rl|	j|krl|	 ||	j ¡rl|jj|d< | j|jfd|i|—ŽS )NrÍ   r   Úrender_label_as_labelÚwithin_columns_clause)	rº   ru   Zsupports_simple_order_by_labelÚ_label_resolve_dictr¡   Z_order_by_label_elementr¢   Zshares_lineager~   )
r€   r¡   rý   r   r   Ú	with_colsÚ
only_fromsÚ	only_colsZresolve_dictZorder_by_elemrP   rP   rT   Úvisit_label_reference  s     
z!SQLCompiler.visit_label_referencec       
   
   K   s¦   | j s|  |j¡S | j d d }|j\}}}y|r>||j }n
||j }W n8 tk
r‚ }	 ztj|jtj	d|	d W d d }	~	X Y n X ||d< | j|fd|i|—ŽS d S )NrÍ   r   zECan't resolve label reference for ORDER BY / GROUP BY / DISTINCT etc.)Úerrrü   rý   )
rº   r~   Z_text_clauserþ   r¡   ÚKeyErrorr   Z_no_text_coercionr   ÚCompileError)
r€   r¡   rý   r   r   rÿ   r   r  r¤   ZkerP   rP   rT   Úvisit_textual_label_reference6  s"    z)SQLCompiler.visit_textual_label_referencec       
      K   sÆ   |o| }||k}|s|r>t |jtjƒr8|  d|j¡}	n|j}	|r˜|d k	rf||	|j||	f|j |jƒ |jj| fdddœ|—Žt	t
j  | j ||	¡ S |rª| j ||	¡S |jj| fddi|—ŽS d S )NÚcolidentT)rý   Úwithin_label_clauserý   F)Ú
isinstancer¢   r   Ú_truncated_labelÚ_truncated_identifierr£   r§   r¡   r‹   Ú	OPERATORSr   Úas_rw   Úformat_label)
r€   r    Úadd_to_result_mapr  rý   rü   rž   Zrender_label_with_asZrender_label_onlyZ	labelnamerP   rP   rT   Úvisit_labelR  s$    
2zSQLCompiler.visit_labelc             C   s   t  d¡‚d S )Nz:Cannot compile Column object until its 'name' is assigned.)r   r  )r€   r   rP   rP   rT   Ú_fallback_column_nameƒ  s    z!SQLCompiler._fallback_column_namec             K   sö   |j  }}|d kr|  |¡}|j}|s>t|tjƒr>|  d|¡}|d k	r^||||||jf|jƒ |rn|  	|¡}n| j
 |¡}|j}|d ks’|r’|js–|S | j
 |¡}	|	r¸| j
 |	¡d }
nd}
|j }t|tjƒrÚ|  d|¡}|
| j
 |¡ d | S d S )Nr  Ú.rŽ   Úalias)r¢   r  Ú
is_literalr	  r   r
  r  r°   r§   Úescape_literal_columnrw   ÚquoterG   Znamed_with_columnÚschema_for_objectÚquote_schema)r€   r   r  Úinclude_tabler   r¢   Ú	orig_namer  rG   Úeffective_schemaZschema_prefixZ	tablenamerP   rP   rT   Úvisit_columnˆ  s.    

zSQLCompiler.visit_columnc             K   s   | j  |j¡S )N)rw   Úformat_collationÚ	collation)r€   r¡   rž   rP   rP   rT   Úvisit_collation°  s    zSQLCompiler.visit_collationc             K   s   |j S )N)r¢   )r€   Z
fromclauser   rP   rP   rT   Úvisit_fromclause³  s    zSQLCompiler.visit_fromclausec             K   s   |j S )N)r¢   )r€   Úindexr   rP   rP   rT   Úvisit_index¶  s    zSQLCompiler.visit_indexc             K   s   ||d< | j jj|jf|ŽS )NÚtype_expression)ru   Útype_compilerr~   r§   )r€   Ú
typeclauserž   rP   rP   rT   Úvisit_typeclause¹  s    zSQLCompiler.visit_typeclausec             C   s   | j jr| dd¡}|S )Nú%z%%)rw   Ú_double_percentsÚreplace)r€   ÚtextrP   rP   rT   Úpost_process_text½  s    zSQLCompiler.post_process_textc             C   s   | j jr| dd¡}|S )Nr'  z%%)rw   r(  r)  )r€   r*  rP   rP   rT   r  Â  s    z!SQLCompiler.escape_literal_columnc          	      s<   ‡ ‡‡fdd„}ˆj sdˆ_t dd„ t |ˆ ˆj¡¡¡S )Nc                s:   |   d¡}|ˆjkr(ˆjˆj| fˆ ŽS ˆj|fˆ ŽS d S )Nr   )r*   Z_bindparamsr~   Úbindparam_string)rá   r¢   )rž   r€   Ú
textclauserP   rT   Údo_bindparamÈ  s    

z2SQLCompiler.visit_textclause.<locals>.do_bindparamTc             S   s
   |   d¡S )Nr   )r*   )rá   rP   rP   rT   rã   Ô  rä   z.SQLCompiler.visit_textclause.<locals>.<lambda>)rº   ÚisplaintextÚBIND_PARAMS_ESCrè   ÚBIND_PARAMSr+  r*  )r€   r-  rž   r.  rP   )rž   r€   r-  rT   Úvisit_textclauseÇ  s    zSQLCompiler.visit_textclausec             K   s˜   | j  }|r| jn| j d }|p>|dkr4| dd¡p>| dd¡}|rt|j | _| _x |jD ]}	| j|	d| jd qZW | j|j	f|Ž}
|r”|r”d|
 }
|
S )	NrÍ   r   Úneed_result_map_for_compoundFrÛ   T)rý   r  z(%s))
rº   Ú_default_stack_entryr¯   r¼   rÜ   Ú_textual_ordered_columnsZcolumn_argsr~   Ú_add_to_result_mapr¡   )r€   ZtafÚcompound_indexrú   Úparensrž   ÚtoplevelrÞ   Úpopulate_result_mapÚcr*  rP   rP   rT   Úvisit_text_as_fromÚ  s"    zSQLCompiler.visit_text_as_fromc             K   s   dS )NZNULLrP   )r€   Úexprrž   rP   rP   rT   Ú
visit_nullú  s    zSQLCompiler.visit_nullc             K   s   | j jrdS dS d S )NrI   Ú1)ru   Úsupports_native_boolean)r€   r=  rž   rP   rP   rT   Ú
visit_trueý  s    zSQLCompiler.visit_truec             K   s   | j jrdS dS d S )Nr%   Ú0)ru   r@  )r€   r=  rž   rP   rP   rT   Úvisit_false  s    zSQLCompiler.visit_falsec                s^   |j }|d krd}n
t|j  }| dd„ ‡ ‡fdd„|jD ƒD ƒ¡}|jrZˆjjrZd| }|S )Nr¬   c             s   s   | ]}|r|V  qd S )NrP   )rR   ÚsrP   rP   rT   ré     s   z/SQLCompiler.visit_clauselist.<locals>.<genexpr>c             3   s   | ]}|j ˆfˆ ŽV  qd S )N)r‹   )rR   r;  )rž   r€   rP   rT   ré     s    zVALUES )Úoperatorr  r/   ÚclausesZ_tuple_valuesru   Ztuple_in_values)r€   Z
clauselistrž   Úsepr*  rP   )rž   r€   rT   Úvisit_clauselist	  s    
zSQLCompiler.visit_clauselistc             K   s˜   d}|j d k	r&||j j| f|Žd 7 }x>|jD ]4\}}|d|j| f|Ž d |j| f|Ž d 7 }q.W |jd k	rŒ|d|jj| f|Ž d 7 }|d7 }|S )NzCASE r¬   zWHEN z THEN zELSE ZEND)r²   r‹   ZwhensZelse_)r€   Úclauser   rS   Zcondrõ   rP   rP   rT   Ú
visit_case  s    
.
zSQLCompiler.visit_casec             K   s   |j j| f|ŽS )N)Ztyped_expressionr‹   )r€   Ztype_coercerž   rP   rP   rT   Úvisit_type_coerce.  s    zSQLCompiler.visit_type_coercec             K   s$   d|j j| f|Ž|jj| f|Žf S )NzCAST(%s AS %s))rI  r‹   r%  )r€   r   r   rP   rP   rT   Ú
visit_cast1  s    zSQLCompiler.visit_castc          	   K   sä   d|d t jkrdn\|d t jkr&dnJ|d dk rTd| jt  t|d ƒ¡f|Žf nd| jt  |d ¡f|Žf |d t jkr‚dn\|d t jkr”dnJ|d dk rÂd| jt  t|d ƒ¡f|Žf nd| jt  |d ¡f|Žf f S )	Nz	%s AND %sr   zUNBOUNDED PRECEDINGzCURRENT ROWz%s PRECEDINGz%s FOLLOWINGr   zUNBOUNDED FOLLOWING)r   ZRANGE_UNBOUNDEDZRANGE_CURRENTr~   ÚliteralÚabs)r€   Úrange_rž   rP   rP   rT   Ú_format_frame_clause7  s    ..z SQLCompiler._format_frame_clausec                sˆ   |j rdˆj|j fˆ Ž }n |jr8dˆj|jfˆ Ž }nd }d|jjˆfˆ Žd ‡ ‡fdd„d|jfd|jffD ƒ|r||gng  ¡f S )	NzRANGE BETWEEN %szROWS BETWEEN %sz%s OVER (%s)r¬   c                s6   g | ].\}}|d k	rt |ƒrd||jˆfˆ Žf ‘qS )Nz%s BY %s)rí   r‹   )rR   ÚwordrI  )r   r€   rP   rT   ú
<listcomp>^  s   z*SQLCompiler.visit_over.<locals>.<listcomp>Z	PARTITIONZORDER)rO  rP  Úrowsr¡   r‹   r/   Zpartition_byÚorder_by)r€   Zoverr   rO  rP   )r   r€   rT   Ú
visit_overN  s    zSQLCompiler.visit_overc             K   s$   d|j j| f|Ž|jj| f|Žf S )Nz%s WITHIN GROUP (ORDER BY %s))r¡   r‹   rT  )r€   Zwithingroupr   rP   rP   rT   Úvisit_withingroupj  s    zSQLCompiler.visit_withingroupc             K   s$   d|j j| f|Ž|jj| f|Žf S )Nz%s FILTER (WHERE %s))Úfuncr‹   Z	criterion)r€   Z
funcfilterr   rP   rP   rT   Úvisit_funcfilterp  s    zSQLCompiler.visit_funcfilterc             K   s*   | j  |j|j¡}d||jj| f|Žf S )NzEXTRACT(%s FROM %s))Úextract_mapr¯   Úfieldr=  r‹   )r€   Úextractr   rZ  rP   rP   rT   Úvisit_extractv  s    zSQLCompiler.visit_extractc                sÒ   |d k	r||j |j d|jƒ tˆd|j  ¡  d ƒ}|rB||f|ŽS t |jd ¡‰ ˆ rd|jršˆ d7 ‰ n6|j ‰ ˆj 	ˆ ¡s‚t
ˆ tjƒrŽˆj ˆ ¡nˆ ‰ ˆ d ‰ d ‡ ‡fdd„|jD ƒˆ g ¡dˆj|f|Ži S d S )NrP   zvisit_%s_funcz%(expr)sr  c                s4   g | ],}ˆj  |¡s tˆ tjƒr,ˆj  |¡n|‘qS rP   )rw   Ú_requires_quotes_illegal_charsr	  r   Úquoted_namer  )rR   Útok)r¢   r€   rP   rT   rR  ”  s   z.SQLCompiler.visit_function.<locals>.<listcomp>r=  )r¢   r§   r·   ÚlowerÚ	FUNCTIONSr¯   Ú	__class__Z	_has_argsrw   r]  r	  r   r^  r  r/   ZpackagenamesÚfunction_argspec)r€   rW  r  r   ÚdisprP   )r¢   r€   rT   Úvisit_function}  s&    
zSQLCompiler.visit_functionc             K   s   |   |j¡S )N)Úvisit_sequenceÚsequence)r€   Z
next_valuerž   rP   rP   rT   Úvisit_next_value_funcŸ  s    z!SQLCompiler.visit_next_value_funcc             K   s   t d| jj ƒ‚d S )Nz2Dialect '%s' does not support sequence increments.)r‰   ru   r¢   )r€   rg  rž   rP   rP   rT   rf  ¢  s    zSQLCompiler.visit_sequencec             K   s   |j j| f|ŽS )N)Zclause_exprr‹   )r€   rW  r   rP   rP   rT   rc  ¨  s    zSQLCompiler.function_argspecr   c                s(  ˆj  }|rˆjnˆj d }|p2|dko2| dd¡}ˆj  |d |d ||dœ¡ ˆj |j¡}	d|	 d  ‡ ‡‡fd	d
„t|jƒD ƒ¡}
|
ˆj	|ft
f dˆ iˆ—ŽŽ7 }
|
ˆj|fˆŽ7 }
|
|jd k	sÒ|jd k	ràˆj|fˆŽpâd7 }
ˆjrü|rüˆ ¡ |
 }
ˆj  d¡ ˆ r |r d|
 d S |
S d S )NrÍ   r   r3  FÚcorrelate_fromsÚasfrom_froms)ri  rj  r   r3  r¬   c             3   s,   | ]$\}}|j ˆfˆ d |dœˆ—ŽV  qdS )F)rú   r8  r7  N)r‹   )rR   Úir;  )rú   r   r€   rP   rT   ré   Â  s   z4SQLCompiler.visit_compound_select.<locals>.<genexpr>rú   rŽ   r÷   rø   )rº   r4  r¯   ÚappendÚcompound_keywordsÚkeywordr/   Ú	enumerateÚselectsÚgroup_by_clauserë   Úorder_by_clauseÚ_limit_clauseÚ_offset_clauseÚlimit_clauserÂ   Ú_render_cte_clauserÝ   )r€   Úcsrú   r8  r7  r   r9  rÞ   Zneed_result_maprn  r*  rP   )rú   r   r€   rT   Úvisit_compound_select«  s4    
 
z!SQLCompiler.visit_compound_selectc             C   s(   d|j ||rd| ndf }t| |d ƒS )Nzvisit_%s_%s%sr­   rŽ   )r•   r·   )r€   Ú	operator_Z
qualifier1Z
qualifier2ÚattrnamerP   rP   rT   Ú_get_operator_dispatchÞ  s
    z"SQLCompiler._get_operator_dispatchc             K   s¢   |j rR|jrt d¡‚|  |j dd¡}|r:|||j f|ŽS | j|t|j  f|ŽS nL|jr”|  |jdd¡}|r||||jf|ŽS | j|t|j f|ŽS n
t d¡‚d S )NzFUnary expression does not support operator and modifier simultaneouslyÚunaryrE  Úmodifierz,Unary expression has no operator or modifier)rE  r}  r   r  r{  Ú _generate_generic_unary_operatorr  Ú _generate_generic_unary_modifier)r€   r|  rž   rd  rP   rP   rT   Úvisit_unaryæ  s&    zSQLCompiler.visit_unaryc             K   s6   |j s| jjr| j|jf|ŽS d| j|jf|Ž S d S )Nz%s = 1)Ú_is_implicitly_booleanru   r@  r~   r¡   )r€   r¡   rE  rž   rP   rP   rT   Úvisit_istrue_unary_operator  s    z'SQLCompiler.visit_istrue_unary_operatorc             K   s:   |j s| jjr"d| j|jf|Ž S d| j|jf|Ž S d S )NzNOT %sz%s = 0)r  ru   r@  r~   r¡   )r€   r¡   rE  rž   rP   rP   rT   Úvisit_isfalse_unary_operator  s    z(SQLCompiler.visit_isfalse_unary_operatorc             K   s   d| j |tjd S )NzNOT %s)Úoverride_operator)Úvisit_binaryr   Úmatch_op)r€   r   rE  rž   rP   rP   rT   Ú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   Úwarn)r€   rP   rP   rT   Ú_emit_empty_in_warning  s    z"SQLCompiler._emit_empty_in_warningc             K   s2   | j jrdS | j jr|  ¡  |  |j|jk¡S d S )Nz1 != 1)ru   Ú_use_static_inÚ_warn_on_empty_inr‰  r~   r1   )r€   r   rE  rž   rP   rP   rT   Úvisit_empty_in_op_binary%  s
    z$SQLCompiler.visit_empty_in_op_binaryc             K   s2   | j jrdS | j jr|  ¡  |  |j|jk¡S d S )Nz1 = 1)ru   rŠ  r‹  r‰  r~   r1   )r€   r   rE  rž   rP   rP   rT   Úvisit_empty_notin_op_binary-  s
    z'SQLCompiler.visit_empty_notin_op_binaryc             C   s   t d| jj ƒ‚d S )Nz3Dialect '%s' does not support empty set expression.)r‰   ru   r¢   )r€   Zelement_typesrP   rP   rT   Úvisit_empty_set_expr5  s    z SQLCompiler.visit_empty_set_exprc       	   
   K   s®   | j r*t|jtjƒr*t|jtjƒr*d|d< |p2|j}|  |dd ¡}|rT|||f|ŽS yt| }W n8 t	k
r˜ } zt
jt | |¡|d W d d }~X Y nX | j||f|ŽS d S )NTÚliteral_bindsr   )rÎ   )Úansi_bind_rulesr	  r1   r   ZBindParameterrB   rE  r{  r  r  r   rÐ   r   ZUnsupportedCompilationErrorÚ_generate_generic_binary)	r€   r   r„  Úeager_groupingrž   ry  rd  Úopstringr  rP   rP   rT   r…  ;  s    

zSQLCompiler.visit_binaryc             K   s   | j |jf|ŽS )N)r~   Zsql_function)r€   r¡   rE  rž   rP   rP   rT   Ú&visit_function_as_comparison_op_binaryV  s    z2SQLCompiler.visit_function_as_comparison_op_binaryc             K   sT   | j jr,| j|jf|Žd | j|jf|Ž S | j|jf|Žd | j|jf|Ž S d S )Nz %% z % )rw   r(  r~   r1   rB   )r€   r   rE  rž   rP   rP   rT   Úvisit_mod_binaryY  s    $zSQLCompiler.visit_mod_binaryc             K   s$   |j |d< | j|d|j d f|ŽS )Nr’  r¬   )r’  r‘  r“  )r€   r¡   rE  rž   rP   rP   rT   Úvisit_custom_op_binaryg  s    
z"SQLCompiler.visit_custom_op_binaryc             K   s   | j ||jd f|ŽS )Nr¬   )r~  r“  )r€   r¡   rE  rž   rP   rP   rT   Úvisit_custom_op_unary_operatorm  s    z*SQLCompiler.visit_custom_op_unary_operatorc             K   s   | j |d|j f|ŽS )Nr¬   )r  r“  )r€   r¡   rE  rž   rP   rP   rT   Úvisit_custom_op_unary_modifierr  s    z*SQLCompiler.visit_custom_op_unary_modifierc             K   s\   |  dd¡}d|d< |jj| fd|i|—Ž| |jj| fd|i|—Ž }|rX|rXd| }|S )NÚ
_in_binaryFTr’  z(%s))r¯   r1   r‹   rB   )r€   r   r“  r’  rž   r™  r*  rP   rP   rT   r‘  w  s     z$SQLCompiler._generate_generic_binaryc             K   s   ||j j| f|Ž S )N)r¡   r‹   )r€   r|  r“  rž   rP   rP   rT   r~  Œ  s    z,SQLCompiler._generate_generic_unary_operatorc             K   s   |j j| f|Ž| S )N)r¡   r‹   )r€   r|  r“  rž   rP   rP   rT   r    s    z,SQLCompiler._generate_generic_unary_modifierc             C   s   t jdtjdS )Nz'%')r   )r   Zliteral_columnr	   Ú
STRINGTYPE)r€   rP   rP   rT   Ú_like_percent_literal’  s    z!SQLCompiler._like_percent_literalc             K   s2   |  ¡ }| j}| |j¡ |¡|_| j||f|ŽS )N)Ú_cloner›  Ú__add__rB   Úvisit_like_op_binary)r€   r   rE  rž   ÚpercentrP   rP   rT   Úvisit_contains_op_binary–  s    z$SQLCompiler.visit_contains_op_binaryc             K   s2   |  ¡ }| j}| |j¡ |¡|_| j||f|ŽS )N)rœ  r›  r  rB   Úvisit_notlike_op_binary)r€   r   rE  rž   rŸ  rP   rP   rT   Úvisit_notcontains_op_binaryœ  s    z'SQLCompiler.visit_notcontains_op_binaryc             K   s,   |  ¡ }| j}| |j¡|_| j||f|ŽS )N)rœ  r›  Ú__radd__rB   rž  )r€   r   rE  rž   rŸ  rP   rP   rT   Úvisit_startswith_op_binary¢  s    z&SQLCompiler.visit_startswith_op_binaryc             K   s,   |  ¡ }| j}| |j¡|_| j||f|ŽS )N)rœ  r›  r£  rB   r¡  )r€   r   rE  rž   rŸ  rP   rP   rT   Úvisit_notstartswith_op_binary¨  s    z)SQLCompiler.visit_notstartswith_op_binaryc             K   s,   |  ¡ }| j}| |j¡|_| j||f|ŽS )N)rœ  r›  r  rB   rž  )r€   r   rE  rž   rŸ  rP   rP   rT   Úvisit_endswith_op_binary®  s    z$SQLCompiler.visit_endswith_op_binaryc             K   s,   |  ¡ }| j}| |j¡|_| j||f|ŽS )N)rœ  r›  r  rB   r¡  )r€   r   rE  rž   rŸ  rP   rP   rT   Úvisit_notendswith_op_binary´  s    z'SQLCompiler.visit_notendswith_op_binaryc             K   sL   |j  dd ¡}d|jj| f|Ž|jj| f|Žf |rFd|  |tj¡ nd S )NÚescapez
%s LIKE %sz ESCAPE rŽ   )Ú	modifiersr¯   r1   r‹   rB   Úrender_literal_valuer	   rš  )r€   r   rE  rž   r¨  rP   rP   rT   rž  º  s    z SQLCompiler.visit_like_op_binaryc             K   sL   |j  dd ¡}d|jj| f|Ž|jj| f|Žf |rFd|  |tj¡ nd S )Nr¨  z%s NOT LIKE %sz ESCAPE rŽ   )r©  r¯   r1   r‹   rB   rª  r	   rš  )r€   r   rE  rž   r¨  rP   rP   rT   r¡  Ç  s    z#SQLCompiler.visit_notlike_op_binaryc             K   sL   |j  dd ¡}d|jj| f|Ž|jj| f|Žf |rFd|  |tj¡ nd S )Nr¨  zlower(%s) LIKE lower(%s)z ESCAPE rŽ   )r©  r¯   r1   r‹   rB   rª  r	   rš  )r€   r   rE  rž   r¨  rP   rP   rT   Úvisit_ilike_op_binaryÒ  s    z!SQLCompiler.visit_ilike_op_binaryc             K   sL   |j  dd ¡}d|jj| f|Ž|jj| f|Žf |rFd|  |tj¡ nd S )Nr¨  zlower(%s) NOT LIKE lower(%s)z ESCAPE rŽ   )r©  r¯   r1   r‹   rB   rª  r	   rš  )r€   r   rE  rž   r¨  rP   rP   rT   Úvisit_notilike_op_binaryÝ  s    z$SQLCompiler.visit_notilike_op_binaryc             K   s&   |j  dd¡}| j||rdndf|ŽS )NrF   Fz BETWEEN SYMMETRIC z	 BETWEEN )r©  r¯   r‘  )r€   r   rE  rž   rF   rP   rP   rT   Úvisit_between_op_binaryè  s    z#SQLCompiler.visit_between_op_binaryc             K   s&   |j  dd¡}| j||rdndf|ŽS )NrF   Fz NOT BETWEEN SYMMETRIC z NOT BETWEEN )r©  r¯   r‘  )r€   r   rE  rž   rF   rP   rP   rT   Úvisit_notbetween_op_binaryî  s
    z&SQLCompiler.visit_notbetween_op_binaryc       
      K   s&  |s<|j  | j¡}|jr<| |¡}| j|fd||dœ|—ŽS |sJ|r„| jr„|jd krn|jd krnt	 
d|j ¡‚| j|fddi|—ŽS |  |¡}|| jkrø| j| }	|	|k	rø|	js¶|jrÖ|	j |j¡sÖt	 
d|j ¡‚n"|	jsâ|jrøt	 
d|j|jf ¡‚| | j|j< | j|< | j|fd|ji|—ŽS )NT)Úskip_bind_expressionrý   r  z@Bind parameter '%s' without a renderable value not allowed here.rý   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§   Údialect_implru   Z_has_bind_expressionÚbind_expressionr~   r  r²   rð   r   r  r°   Úrender_literal_bindparamÚ_truncate_bindparamr¸   rK   r¦   ÚintersectionZ_is_crudr,  r°  )
r€   rê   rý   r  r¯  r   Úimplr²  r¢   ÚexistingrP   rP   rT   Úvisit_bindparamö  sB    	




zSQLCompiler.visit_bindparamc             K   s   |j }|  ||j¡S )N)rñ   rª  r§   )r€   rê   rž   r²   rP   rP   rT   r³  3  s    z$SQLCompiler.render_literal_bindparamc             C   s(   |  | j¡}|r||ƒS td| ƒ‚dS )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 %rN)Z_cached_literal_processorru   r‰   )r€   r²   r   Ú	processorrP   rP   rT   rª  7  s
    z SQLCompiler.render_literal_valuec             C   s@   || j kr| j | S |j}t|tjƒr2|  d|¡}|| j |< |S )Nrê   )r¹   r°   r	  r   r
  r  )r€   rê   Z	bind_namerP   rP   rT   r´  J  s    


zSQLCompiler._truncate_bindparamc             C   sš   ||f| j kr| j ||f S | | j¡}t|ƒ| jd kr„| j  |d¡}|dt| jd dƒ… d t|ƒdd …  }|d | j |< n|}|| j ||f< |S )Né   r   r   r­   r   )rÆ   Z	apply_maprÅ   rí   rÃ   r¯   ÚmaxÚhex)r€   Zident_classr¢   ZanonnameÚcounterZ	truncnamerP   rP   rT   r  W  s    ,z!SQLCompiler._truncated_identifierc             C   s
   || j  S )N)rÅ   )r€   r¢   rP   rP   rT   Ú
_anonymizej  s    zSQLCompiler._anonymizec             K   sJ   | j r&|d k	r| |¡ n| j |¡ |r8d| _d| S | jd|i S d S )NTz([EXPANDING_%s])r¢   )r¼   rl  r½   Úcontains_expanding_parametersrÁ   )r€   r¢   Úpositional_namesr°  rž   rP   rP   rT   r,  m  s    zSQLCompiler.bindparam_stringc                sÈ  ˆ   ¡  ||d< t|jtjƒr.ˆ  d|j¡}n|j}d}d}	|ˆ jkr’ˆ j| }
||
k}	||
jksj||
krpd}n"|
|jkr„ˆ j|
= nt	 
d| ¡‚|sš|rÔ|jd k	rÌ|j}|jj}t|tjƒrÔˆ  d|¡}n|}d }|rV|ˆ j|< d|jjkrdˆ jkrˆ j d|jjd i¡ˆ _|ˆ jkr2ˆ j|f|Ž |sV|ˆ jkrV|jrRdˆ _ˆ j ||¡}|jrÞt|jtjƒr€|j}n(t|jtjƒrž|jjd }n
ds¨t‚dd	„ t |j¡D ƒ}|d
d ‡ fdd„|D ƒ¡ 7 }ˆ jrøg  |d< ˆ j |< |dˆ j!||j"f|Ž|jj#ˆ fddi|—Žf 7 }|j$rL|dˆ j!||j$f|Ž 7 }|ˆ j|< |rÄ|sv|	rvˆ j ||¡S |r¶ˆ j ||¡}ˆ j %|¡r¤ˆ j &|¡}|ˆ  '|¡7 }|S ˆ j ||¡S d S )NÚvisiting_cter  TFz5Multiple, unrelated CTEs found with the same name: %rZ
autocommitr   c             S   s   g | ]}|d k	r|‘qS )NrP   )rR   r;  rP   rP   rT   rR  Í  s   z)SQLCompiler.visit_cte.<locals>.<listcomp>z(%s)z, c             3   s   | ]}ˆ j  |¡V  qd S )N)rw   Úformat_column)rR   r±   )r€   rP   rT   ré   Ô  s   z(SQLCompiler.visit_cte.<locals>.<genexpr>rÀ  z	 AS %s
%srú   r¬   )(rÚ   r	  r¢   r   r
  r  r×   Z	_restatesrÂ   r   r  Z
_cte_aliasr¡   r|   r}   rJ   Ú	visit_cteÚ	recursiverØ   rw   Úformat_aliasÚoriginalr   ÚSelectÚCompoundSelectrp  ÚAssertionErrorr   Zunique_listÚinner_columnsr/   r¼   rÙ   Ú_generate_prefixesÚ	_prefixesr‹   Ú	_suffixesÚ_requires_quotesr  Úget_render_as_alias_suffix)r€   Úcterú   ÚashintÚ	fromhintsrÁ  r   Zcte_nameZ
is_new_cteZembedded_in_current_named_cteZexisting_cteZpre_alias_cteZcte_pre_alias_namer*  Z
col_sourceZ
recur_colsrP   )r€   rT   rÃ  {  sŽ    	









zSQLCompiler.visit_ctec       	      K   s¦   |s|r,t |jtjƒr&|  d|j¡}n|j}|r>| j ||¡S |r’|jj| fddi|—Ž|  	| j ||¡¡ }|rŽ||krŽ|  
|||| |¡}|S |jj| f|ŽS d S )Nr  rú   T)r	  r¢   r   r
  r  rw   rÅ  rÆ  r‹   rÏ  Úformat_from_hint_text)	r€   r  rú   rÑ  ÚiscrudrÒ  r   Z
alias_nameÚretrP   rP   rT   Úvisit_alias÷  s     	zSQLCompiler.visit_aliasc             K   s   d|d< d| j |f|Ž S )NTÚlateralz
LATERAL %s)rÖ  )r€   r×  rž   rP   rP   rT   Úvisit_lateral  s    zSQLCompiler.visit_lateralc             K   sR   d| j |fddi|—Ž| ¡ j| f|Žf }|jd k	rN|d|jj| f|Ž 7 }|S )Nz%s TABLESAMPLE %srú   Tz REPEATABLE (%s))rÖ  Z_get_methodr‹   Úseed)r€   Ztablesamplerú   rž   r*  rP   rP   rT   Úvisit_tablesample  s    
zSQLCompiler.visit_tablesamplec             C   s   d| S )Nz AS rP   )r€   Zalias_name_textrP   rP   rT   rÏ  )  s    z&SQLCompiler.get_render_as_alias_suffixc             C   s   | j  ||||f¡ d S )N)r»   rl  )r€   Úkeynamer¢   Úobjectsr   rP   rP   rT   r6  ,  s    zSQLCompiler._add_to_result_mapc	                sŒ  ˆ j  ˆj¡}	|	jr@|s|r@|	 ˆ ¡}
|r:‡ ‡fdd„}qTd}nˆ }
|rPˆj}nd}|s`|
}ntˆ tjƒr|
ˆ k	rŠt	|
ˆ j
ˆ jfd}n|
}nà|dk	r°|r°t	|
|ˆ jfd}nÀ|rútˆ tjƒrúˆ jsúˆ jdk	rútˆ jtjƒsút	|
t ˆ j
¡ˆ jfd}nvtˆ tjƒsFtˆ tjƒrˆ jrFtˆ dƒr8tˆ tjƒrFt	|
ˆ jƒ}n*|
ˆ k	rlt	|
t ˆ j
¡ˆ jfd}n|
}|j||d |jˆf|ŽS )z.produce labeled columns present in a select().c                s   ˆ  | |ˆ f| |¡ d S )N)r6  )rÛ  r¢   rÜ  r   )r   r€   rP   rT   r  E  s    z;SQLCompiler._label_select_column.<locals>.add_to_result_mapN)r¥   r¢   )rý   r  )r§   r±  ru   Z_has_column_expressionZcolumn_expressionr6  r	  r   ZLabelrŸ   r¢   r¡   Ú
_key_labelZColumnClauser  rG   r   rÇ  Z_as_truncatedr°   Z
TextClauseZUnaryExpressionZwraps_column_expressionÚhasattrr   ZFunctionZ
anon_labelÚupdater‹   )r€   rC   r   r:  rú   Úcolumn_clause_argsr¢   rý   Úneed_column_expressionsr¶  Zcol_exprr  Zresult_exprrP   )r   r€   rT   Ú_label_select_column/  s\    




z SQLCompiler._label_select_columnc             C   s    |   ||¡}|r|d| 7 }|S )Nr¬   )Úget_from_hint_text)r€   ÚsqltextrG   ÚhintrÔ  ÚhinttextrP   rP   rT   rÓ  ‹  s    z!SQLCompiler.format_from_hint_textc             C   s   d S )NrP   )r€   ZbyfromsrP   rP   rT   Úget_select_hint_text‘  s    z SQLCompiler.get_select_hint_textc             C   s   d S )NrP   )r€   rG   r*  rP   rP   rT   rã  ”  s    zSQLCompiler.get_from_hint_textc             C   s   d S )NrP   )r€   rG   r*  rP   rP   rT   Úget_crud_hint_text—  s    zSQLCompiler.get_crud_hint_textc             C   s
   d  |¡S )Nr¬   )r/   )r€   Z
hint_textsrP   rP   rT   Úget_statement_hint_textš  s    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 krˆd |  S | ˆ kr(ˆ |  S |   ¡  }ˆ | < |jr^|jr^t|jtjƒr^| ¡  ˆ|jf|Ž|_ˆ|jf|Ž}tj	|j
gdd ¡ }x|jD ]}|j|_|j|_qœW tt|jj
j|jƒƒ}|||j
j< |||j
j< |||jj
j< |||jj
j< x8tˆd  ¡ ƒD ]$\}}||kr|| ˆd |< qW ˆd  |¡ ||_ˆ|jf|Ž|_n”|jr„d|d< |jf dˆi|—Ž nn|jrÞ|jrÞ| dd ¡dk}	|	r´ˆ i ¡ d|d< |jf dˆi|—Ž |	ròˆd= n|jf dˆi|—Ž |S )NrÍ   T)Ú
use_labelsZselect_containerZtransform_clueÚcloneZinside_select)rœ  Zis_selectableZ_is_joinr	  rB   r   ZFromGroupingZ_reset_exportedr1   rÇ  r¡   r  r;  r°   rÝ  r¢   Z_labelrë   ÚziprÒ   Úitemsrß  ÚonclauseZ_is_from_containerZ_copy_internalsZ
_is_selectr¯   rl  )
r¡   rž   ZnewelemrB   Zselectable_r;  Ztranslate_dictÚkÚvZbarrier_select)ÚclonedÚcolumn_translateÚvisitrP   rT   ró  §  sR    

z=SQLCompiler._transform_select_for_nested_joins.<locals>.visitrP   )r€   rC   rP   )rñ  rò  ró  rT   Ú"_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 )N)rÝ  )rR   r;  rP   rP   rT   ré   þ  s    zESQLCompiler._transform_result_map_for_nested_joins.<locals>.<genexpr>c             3   s   | ]}ˆ |j  |fV  qd S )N)rÝ  )rR   r;  )Ú	inner_colrP   rT   ré     s    c                s2   g | ]*\}}}}||t ‡ fd d„|D ƒƒ|f‘qS )c                s   g | ]}ˆ   ||¡‘qS rP   )r¯   )rR   r¤   )ÚdrP   rT   rR    s    zQSQLCompiler._transform_result_map_for_nested_joins.<locals>.<listcomp>.<listcomp>)Útuple)rR   r°   r¢   ÚobjsÚtyp)rö  rP   rT   rR    s   zFSQLCompiler._transform_result_map_for_nested_joins.<locals>.<listcomp>)rë   rÊ  r»   )r€   rC   Útransformed_selectrP   )rö  rõ  rT   Ú&_transform_result_map_for_nested_joinsú  s
    
z2SQLCompiler._transform_result_map_for_nested_joinsri  rj  c       	      C   s\   | j  }|r| jn| j d }|d }|d }|rJ|sJ|j| |¡dd}n|j||d}|S )NrÍ   ri  rj  rP   )Úexplicit_correlate_fromsÚimplicit_correlate_froms)rº   r4  Ú_get_display_fromsÚ
difference)	r€   rC   rú   r×  r9  rÞ   ri  rj  ÚfromsrP   rP   rT   Ú_display_froms_for_select  s    
z%SQLCompiler._display_froms_for_selectc	                sp  ˆj o| oˆj oˆjj }
|
rJˆ ˆ¡}ˆj|fˆ |||ddœ|	—Ž}ˆj }|r\ˆjnˆjd }|p€| dd¡p€| dd¡ ‰‰|dkr’d‰ˆs¤d|	kr¤|	d= |
r¼ˆr¸ˆ ˆ|¡ |S ˆ 	ˆ|ˆ |¡}|	 
¡ ‰ˆ ddd	œ¡ d
}ˆjrˆ ˆ¡\}}|r||d 7 }nd }ˆjr4|ˆjˆˆjf|	Ž7 }|ˆjˆf|	Ž7 }dd„ ‡ ‡‡‡‡‡fdd„ˆjD ƒD ƒ}ˆrº|d k	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|	Ž 7 }ˆj d¡ ˆ sV|rh|rhd| d S |S d S )NT)rú   r8  rÒ  r7  Únested_join_translationrÍ   r3  FrÛ   r   r  )r  rý   zSELECT r¬   c             S   s   g | ]}|d k	r|‘qS )NrP   )rR   r;  rP   rP   rT   rR  v  s   z,SQLCompiler.visit_select.<locals>.<listcomp>c                s(   g | ] \}}ˆj ˆ|ˆˆ ˆ|ˆd ‘qS ))r¢   rá  )râ  )rR   r¢   r   )rú   rà  rá  r:  rC   r€   rP   rT   rR  x  s   	c             S   s   g | ]\}}|‘qS rP   rP   )rR   r°   r¢   rP   rP   rT   rR  Œ  s    c             S   s   g | ]\}}|‘qS rP   rP   )rR   r°   r¢   rP   rP   rT   rR  Ž  s   c                s2   g | ]*\}}}}||t ‡ fd d„|D ƒƒ|f‘qS )c             3   s   | ]}ˆ   ||¡V  qd S )N)r¯   )rR   Úo)Ú	translaterP   rT   ré   •  s    z6SQLCompiler.visit_select.<locals>.<listcomp>.<genexpr>)r÷  )rR   r°   r¢   rŒ   r   )r  rP   rT   rR  •  s   c                s$   g | ]\}}|d ˆ j jfkr|‘qS )Ú*)ru   r¢   )rR   Údialect_nameZht)r€   rP   rT   rR  Ÿ  s   r÷   rø   )rê  rº   ru   Zsupports_right_nested_joinsrô  Úvisit_selectr4  r¯   rû  Ú_setup_select_stackÚcopyrß  Ú_hintsÚ_setup_select_hintsrÌ  rË  Úget_select_precolumnsZ_columns_plus_namesrë   rì  r»   Ú_compose_select_bodyZ_statement_hintsré  rÂ   rv  rÍ  rÝ   )r€   rC   rú   r8  rÒ  r7  r  Zselect_wraps_forr×  r   Zneeds_nested_translationrú  r*  r9  rÞ   r   Ú	hint_textÚbyfromrÊ  Zper_dialectrP   )rú   rà  rá  r:  rC   r€   r  rT   r  %  sŠ    
	


zSQLCompiler.visit_selectc                s.   t ‡ fdd„|j ¡ D ƒƒ}ˆ  |¡}||fS )Nc          	      s>   g | ]6\\}}}|d ˆ j jfkr||d|jˆ ddi f‘qS )r  r¢   T)rÑ  )ru   r¢   r‹   )rR   Úfrom_ru   ræ  )r€   rP   rT   rR  ¸  s   
z3SQLCompiler._setup_select_hints.<locals>.<listcomp>)rë   r
  rí  rç  )r€   rC   r  r  rP   )r€   rT   r  µ  s
    

zSQLCompiler._setup_select_hintsc             C   sp   |d }|d }|r.|s.|j | |¡dd}n|j ||d}ttj|Ž ƒ}| |¡}	||	|dœ}
| j |
¡ |S )Nri  rj  rP   )rü  rý  )rj  ri  r   )rþ  rÿ  rE   r   Ú_from_objectsrJ   rº   rl  )r€   rC   rÞ   rú   r×  ri  rj  r   Znew_correlate_fromsZall_correlate_fromsZ	new_entryrP   rP   rT   r  Ä  s"    

zSQLCompiler._setup_select_stackc                sB  |d  |¡7 }|rb|d7 }|jrB|d  ‡ ‡‡fdd„|D ƒ¡7 }qn|d  ‡‡fdd„|D ƒ¡7 }n|ˆ ¡ 7 }|jd k	r˜|jjˆfˆŽ}|r˜|d| 7 }|jjr²|ˆj|fˆŽ7 }|jd k	rÜ|jjˆfˆŽ}|rÜ|d| 7 }|j	jrö|ˆj
|fˆŽ7 }|jd k	s|jd k	r |ˆj|fˆŽ7 }|jd k	r>|ˆj|fˆŽ7 }|S )Nz, z 
FROM c                s$   g | ]}|j ˆfd ˆ dœˆ—Ž‘qS )T)rú   rÒ  )r‹   )rR   Úf)r  r   r€   rP   rT   rR  ì  s   z4SQLCompiler._compose_select_body.<locals>.<listcomp>c                s"   g | ]}|j ˆfd diˆ —Ž‘qS )rú   T)r‹   )rR   r  )r   r€   rP   rT   rR  õ  s   z 
WHERE z	 
HAVING )r/   r
  rö   Ú_whereclauser‹   Ú_group_by_clauserF  rq  Z_havingÚ_order_by_clauserr  rs  rt  ru  Z_for_update_argÚfor_update_clause)r€   r*  rC   rÊ  r   r  r   ÚtrP   )r  r   r€   rT   r  á  s:    

z SQLCompiler._compose_select_bodyc                s*   d  ‡ ‡fdd„|D ƒ¡}|r&|d7 }|S )Nr¬   c             3   s4   | ],\}}|d ks|ˆj jkr|jˆfˆ ŽV  qd S )N)ru   r¢   r‹   )rR   Úprefixr  )rž   r€   rP   rT   ré   	  s   z1SQLCompiler._generate_prefixes.<locals>.<genexpr>)r/   )r€   ÚstmtÚprefixesrž   rI  rP   )rž   r€   rT   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 rP   )rÙ   )rR   rÐ  )r€   rP   rT   rR  $	  s    z2SQLCompiler._render_cte_clause.<locals>.<listcomp>r¬   z, 
c             S   s   g | ]}|‘qS rP   rP   )rR   ÚtxtrP   rP   rT   rR  (	  s    z
 )r¼   ÚsumrÂ   r½   Úget_cte_preamblerØ   r/   Úvalues)r€   Zcte_textrP   )r€   rT   rv  !	  s    
zSQLCompiler._render_cte_clausec             C   s   |rdS dS d S )NzWITH RECURSIVEZWITHrP   )r€   rÄ  rP   rP   rT   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.

        z	DISTINCT rŽ   )Z	_distinct)r€   rC   rž   rP   rP   rT   r  2	  s    z!SQLCompiler.get_select_precolumnsc             K   s$   |j j| f|Ž}|rd| S dS dS )z5allow dialects to customize how GROUP BY is rendered.z
 GROUP BY rŽ   N)r  r‹   )r€   rC   rž   Zgroup_byrP   rP   rT   rq  9	  s    zSQLCompiler.group_by_clausec             K   s$   |j j| f|Ž}|rd| S dS dS )z5allow dialects to customize how ORDER BY is rendered.z
 ORDER BY rŽ   N)r  r‹   )r€   rC   rž   rT  rP   rP   rT   rr  B	  s    zSQLCompiler.order_by_clausec             K   s   dS )Nz FOR UPDATErP   )r€   rC   rž   rP   rP   rT   r  K	  s    zSQLCompiler.for_update_clausec             C   s   t  d¡‚d S )Nz@RETURNING is not supported by this dialect's statement compiler.)r   r  )r€   r  Úreturning_colsrP   rP   rT   Úreturning_clauseN	  s    zSQLCompiler.returning_clausec             K   s^   d}|j d k	r&|d| j|j f|Ž 7 }|jd k	rZ|j d krB|d7 }|d| j|jf|Ž 7 }|S )NrŽ   z
 LIMIT z

 LIMIT -1z OFFSET )rs  r~   rt  )r€   rC   rž   r*  rP   rP   rT   ru  T	  s    


zSQLCompiler.limit_clausec       
      K   sv   |s|rn| j  |¡}|r<|r<| j  |¡d | j  |j¡ }	n| j  |j¡}	|rj||krj|  |	||| |¡}	|	S dS d S )Nr  rŽ   )rw   r  r  r  r¢   rÓ  )
r€   rG   rú   rÔ  rÑ  rÒ  Ú
use_schemar   r  rÕ  rP   rP   rT   Úvisit_table^	  s    
 zSQLCompiler.visit_tablec             K   sd   |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|Ž S )Nz FULL OUTER JOIN z LEFT OUTER JOIN z JOIN rú   Tz ON )r)   Zisouterr1   r‹   rB   rî  )r€   r/   rú   r   Z	join_typerP   rP   rT   Ú
visit_join{	  s    zSQLCompiler.visit_joinc                sF   t ‡ fdd„|j ¡ D ƒƒ}|j|kr>ˆ  ||j||j d¡}||fS )Nc                s,   g | ]$\\}}}|d ˆ j jfkr||f‘qS )r  )ru   r¢   )rR   rG   ru   r  )r€   rP   rT   rR  	  s   
z1SQLCompiler._setup_crud_hints.<locals>.<listcomp>T)rë   r
  rí  rG   rÓ  )r€   r  Ú
table_textÚdialect_hintsrP   )r€   rT   Ú_setup_crud_hintsŠ	  s    

zSQLCompiler._setup_crud_hintsc                s¤  | j  }| j  tƒ tƒ |dœ¡ tj| |tjf|Ž}|sZ| jjsZ| jjsZt	 
d| jj ¡‚|jr„| jjszt	 
d| jj ¡‚|d }n|}| j‰ | jj}d}|jr¶|| j||jf|Ž7 }|d7 }ˆ  |j¡}	|jrà|  ||	¡\}
}	||	7 }|sò|s|dd ‡ fd	d
„|D ƒ¡ 7 }| js"|jrN|  || jp4|j¡}| jrR|d| 7 }nd }|jd k	rª| j| jf|Ž}| jrœ|rœ| jjrœ|d|  ¡ |f 7 }n|d| 7 }nh|sÀ|rÀ|d7 }nR|jræ|dd dd„ |D ƒ¡ 7 }n,d dd
„ |D ƒ¡}|d| 7 }|r|| _ |j!d k	r@| j|j!f|Ž}|r@|d| 7 }|rZ| jsZ|d| 7 }| jr~|r~| jjs~|  ¡ | }| j  "d¡ |rœd| d S |S d S )N)ri  rj  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)z, c                s   g | ]}ˆ   |d  ¡‘qS )r   )rÂ  )rR   r;  )rw   rP   rT   rR  Ñ	  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 )z(%s)z, c             s   s   | ]}|d  V  qdS )r   NrP   )rR   r;  rP   rP   rT   ré   ê	  s    z5SQLCompiler.visit_insert.<locals>.<genexpr>.<genexpr>N)r/   )rR   Zcrud_param_setrP   rP   rT   ré   ê	  s   z+SQLCompiler.visit_insert.<locals>.<genexpr>c             S   s   g | ]}|d  ‘qS )r   rP   )rR   r;  rP   rP   rT   rR  ï	  s    z VALUES (%s)rÍ   r÷   rø   )#rº   rl  rE   r   Ú_setup_crud_paramsZISINSERTru   Úsupports_default_valuesZsupports_empty_insertr   r  r¢   Z_has_multi_parametersZsupports_multivalues_insertrw   rÌ  rË  Úformat_tablerG   r
  r&  r/   rË   rÊ   r   Úreturning_precedes_valuesrC   r~   Z_insert_from_selectrÂ   Zcte_follows_insertrv  Úinsert_single_values_exprZ_post_values_clauserÝ   )r€   Zinsert_stmtrú   rž   r9  Úcrud_paramsZcrud_params_singler(  r*  r$  r­   r   Zselect_textr+  Zpost_values_clauserP   )rw   rT   Úvisit_insert˜	  sŠ    



zSQLCompiler.visit_insertc             C   s   dS )z3Provide a hook for MySQL to add LIMIT to the UPDATENrP   )r€   Úupdate_stmtrP   rP   rT   Úupdate_limit_clause
  s    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€   r.  Ú
from_tableÚextra_fromsrž   rP   rP   rT   Úupdate_tables_clause
  s    z SQLCompiler.update_tables_clausec             K   s   t dƒ‚dS )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 UPDATEN)r‰   )r€   r.  r0  r1  Ú
from_hintsrž   rP   rP   rT   Úupdate_from_clause
  s    	zSQLCompiler.update_from_clausec                s(  ˆj  }|j}t|ƒ}|rHtt |j¡ƒ‰‡fdd„|D ƒ}ˆ |¡}ng }|jh}ˆj  |||dœ¡ d}	|j	rˆ|	ˆj
||j	f|Ž7 }	ˆj||j|f|Ž}
tjˆ|tjf|Ž}|jrÈˆ ||
¡\}}
nd }|	|
7 }	|	d7 }	|oäˆj‰ |	d ‡ ‡fdd„|D ƒ¡7 }	ˆjs|jr:ˆjr:|	d	ˆ |ˆjp2|j¡ 7 }	|rhˆj||j||f|Ž}|rh|	d	| 7 }	|jd k	r–ˆj|jf|Ž}|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 d S )Nc                s   g | ]}|ˆ kr|‘qS rP   rP   )rR   r  )Ú
main_fromsrP   rT   rR  .
  s    z,SQLCompiler.visit_update.<locals>.<listcomp>)ri  rj  r   zUPDATE z SET z, c             3   s,   | ]$}|d  j ˆˆ dd |d  V  qdS )r   )r  ú=r   N)r‹   )rR   r;  )r  r€   rP   rT   ré   Y
  s   z+SQLCompiler.visit_update.<locals>.<genexpr>r¬   z WHERE rÍ   r÷   rø   )rº   Ú_extra_fromsÚboolrE   r   r  rG   rJ   rl  rÌ  rË  r2  r   r'  ZISUPDATEr
  r&  Ú'render_table_with_column_in_update_fromr/   rË   rÊ   r*  r   r4  r  r~   r/  rÂ   rv  rÝ   )r€   r.  rú   rž   r9  r1  Zis_multitableZrender_extra_fromsri  r*  r$  r,  r%  Úextra_from_textr  ru  rP   )r  r5  r€   rT   Úvisit_update$
  sz    


zSQLCompiler.visit_updatec             C   s   t  | | j¡S )N)r   Ú_key_getters_for_crud_columnrz   )r€   rP   rP   rT   r<  Š
  s    z(SQLCompiler._key_getters_for_crud_columnc             K   s   t dƒ‚dS )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 DELETEN)r‰   )r€   r.  r0  r1  r3  rž   rP   rP   rT   Údelete_extra_from_clauseŽ
  s    z$SQLCompiler.delete_extra_from_clausec             C   s   |j | dddS )NT)rú   rÔ  )r‹   )r€   Údelete_stmtr0  r1  rP   rP   rT   Údelete_table_clausež
  s    zSQLCompiler.delete_table_clausec             K   s€  | j  }tj| |tjf|Ž |j}|jh |¡}| j  |||dœ¡ d}|jrd|| j	||jf|Ž7 }|d7 }|  
||j|¡}|jr”|  ||¡\}	}nd }	||7 }|jrÂ| jrÂ|d|  ||j¡ 7 }|rì| j||j||	f|Ž}
|
rì|d|
 7 }|jd k	r|jj| f|Ž}|r|d| 7 }|jr@| js@|d|  ||j¡ 7 }| jrZ|rZ|  ¡ | }| j  d¡ |rxd| d S |S d S )	N)ri  rj  r   zDELETE zFROM r¬   z WHERE rÍ   r÷   rø   )rº   r   r'  ZISDELETEr7  rG   rJ   rl  rÌ  rË  r?  r
  r&  rÊ   r*  r   r=  r  r‹   rÂ   rv  rÝ   )r€   r>  rú   rž   r9  r1  ri  r*  r$  r%  r:  r  rP   rP   rT   Úvisit_delete¡
  s\    
zSQLCompiler.visit_deletec             C   s   d| j  |¡ S )NzSAVEPOINT %s)rw   Úformat_savepoint)r€   Úsavepoint_stmtrP   rP   rT   Úvisit_savepointë
  s    zSQLCompiler.visit_savepointc             C   s   d| j  |¡ S )NzROLLBACK TO SAVEPOINT %s)rw   rA  )r€   rB  rP   rP   rT   Úvisit_rollback_to_savepointî
  s    z'SQLCompiler.visit_rollback_to_savepointc             C   s   d| j  |¡ S )NzRELEASE SAVEPOINT %s)rw   rA  )r€   rB  rP   rP   rT   Úvisit_release_savepointó
  s    z#SQLCompiler.visit_release_savepoint)NF)NNT)F)F)F)NFFN)NT)NFT)N)FTr   )NF)F)FFF)NF)FFNN)FFFN)F)NTF)F)FTNr   FNF)FFFNT)F)F)F)F)žr•   r–   r—   r˜   ÚEXTRACT_MAPrY  ÚCOMPOUND_KEYWORDSrm  rÉ   rÇ   rÈ   r/  rË   r*  r9  r¿  r  r5  rÜ   r¿   r+  rÓ   rÔ   r‚   r›   rÑ   rÕ   r   Zmemoized_instancemethodrÚ   Ú
contextlibÚcontextmanagerrß   rÌ   Úmemoized_propertyrì   rî   rŠ   r   r‡   Údependenciesrô   rö   rû   r  r  r  r  r  r  r   r"  r&  r+  r  r2  r<  r>  rA  rC  rH  rJ  rK  rL  rP  rU  rV  rX  r\  re  rh  rf  rc  rx  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  r¾  r,  rÃ  rÖ  rØ  rÚ  rÏ  r6  râ  rÓ  rç  rã  rè  ré  rô  rû  r™   Ú	frozensetr4  r  r  r  r  r  rË  rv  r  r  rq  rr  r  r   ru  r"  r#  r&  r-  r/  r2  r4  r;  r<  r=  r?  r@  rC  rD  rE  rP   rP   rP   rT   r´   ¿  sL  	H&8	"   +'"2			  8   y   
  S]       6
		    p
fJr´   c               @   sX   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d„ Zdd„ ZdS )ÚStrSQLCompilera“  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:`_expression.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:`_expression.ClauseElement.compile`
    directly.

    .. seealso::

        :ref:`faq_sql_expression_string`

    c             C   s   dS )Nz<name unknown>rP   )r€   r   rP   rP   rT   r    s    z$StrSQLCompiler._fallback_column_namec             K   s$   d| j |jf|Ž| j |jf|Žf S )Nz%s[%s])r~   r1   rB   )r€   r   rE  rž   rP   rP   rT   Úvisit_getitem_binary  s    z#StrSQLCompiler.visit_getitem_binaryc             K   s   | j ||f|ŽS )N)rN  )r€   r   rE  rž   rP   rP   rT   Úvisit_json_getitem_op_binary  s    z+StrSQLCompiler.visit_json_getitem_op_binaryc             K   s   | j ||f|ŽS )N)rN  )r€   r   rE  rž   rP   rP   rT   Ú!visit_json_path_getitem_op_binary  s    z0StrSQLCompiler.visit_json_path_getitem_op_binaryc             K   s   d| j  |¡ S )Nz<next sequence value: %s>)rw   Úformat_sequence)r€   Úseqrž   rP   rP   rT   rf    s    zStrSQLCompiler.visit_sequencec                s&   ‡ fdd„t  |¡D ƒ}dd |¡ S )Nc          	      s   g | ]}ˆ   d |ddi ¡‘qS )NTF)râ  )rR   r;  )r€   rP   rT   rR  !  s   z3StrSQLCompiler.returning_clause.<locals>.<listcomp>z
RETURNING z, )r   Z_select_iterablesr/   )r€   r  r  ÚcolumnsrP   )r€   rT   r     s    
zStrSQLCompiler.returning_clausec                s    dd  ‡ ‡‡fdd„|D ƒ¡ S )NzFROM z, c             3   s&   | ]}|j ˆfd ˆ dœˆ—ŽV  qdS )T)rú   rÒ  N)r‹   )rR   r  )r3  rž   r€   rP   rT   ré   +  s   z4StrSQLCompiler.update_from_clause.<locals>.<genexpr>)r/   )r€   r.  r0  r1  r3  rž   rP   )r3  rž   r€   rT   r4  '  s    z!StrSQLCompiler.update_from_clausec                s    dd  ‡ ‡‡fdd„|D ƒ¡ S )Nz, c             3   s&   | ]}|j ˆfd ˆ dœˆ—ŽV  qdS )T)rú   rÒ  N)r‹   )rR   r  )r3  rž   r€   rP   rT   ré   3  s   z:StrSQLCompiler.delete_extra_from_clause.<locals>.<genexpr>)r/   )r€   r.  r0  r1  r3  rž   rP   )r3  rž   r€   rT   r=  /  s    z'StrSQLCompiler.delete_extra_from_clausec             C   s   d| S )Nz[%s]rP   )r€   rG   r*  rP   rP   rT   rã  7  s    z!StrSQLCompiler.get_from_hint_textN)r•   r–   r—   r˜   r  rN  rO  rP  rf  r   r4  r=  rã  rP   rP   rP   rT   rM  ù
  s   rM  c               @   sJ  e Zd Zejdd„ ƒZejdd„ ƒZdNdd„Zdd	„ Zd
d„ Z	dd„ Z
dd„ ZdOdd„ZdPdd„Zdd„ Zdd„ Zdd„ ZdQdd„Zdd„ ZdRd 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(dLdM„ Z)dS )SÚDDLCompilerc             C   s   | j j| j d | jdS )N)rx   )ru   Zstatement_compilerrx   )r€   rP   rP   rT   rŠ   <  s    zDDLCompiler.sql_compilerc             C   s   | j jS )N)ru   r$  )r€   rP   rP   rT   r$  B  s    zDDLCompiler.type_compilerNc             C   s   d S )NrP   )r€   r‡   rP   rP   rT   r   F  s    zDDLCompiler.construct_paramsc             K   sš   |j }t|jtjƒrˆ| ¡ }| j}| |j¡}t|ƒdkrJ|d d }}n|d |d  }}| 	d|¡ | 	d|¡ | 	d| 
|j¡¡ | j |j| ¡S )Nr   r   rŽ   rÍ   rG   r   Úfullname)Úcontextr	  Útargetr   ZTabler	  rw   Úformat_table_seqrí   Ú
setdefaultr)  rŠ   r+  rz   )r€   Zddlr   rV  rw   ÚpathrG   ZschrP   rP   rT   Ú	visit_ddlI  s    zDDLCompiler.visit_ddlc             C   s   | j  |j¡}d| S )NzCREATE SCHEMA )rw   Úformat_schemar¡   )r€   r   r   rP   rP   rT   Úvisit_create_schema\  s    zDDLCompiler.visit_create_schemac             C   s(   | j  |j¡}d| }|jr$|d7 }|S )NzDROP SCHEMA z CASCADE)rw   r\  r¡   Úcascade)r€   Údropr   r*  rP   rP   rT   Úvisit_drop_schema`  s
    zDDLCompiler.visit_drop_schemac             C   sV  |j }| j}d}|jr*|d |j¡d 7 }|d| |¡ d 7 }|  |¡}|rZ||d 7 }|d7 }d}d}x®|jD ]¤}|j }	yD| j||	joŽ| d}
|
d k	r´||7 }d}|d	|
 7 }|	jr¾d
}W qr t	j
k
r } z2tjt	 
t d¡|j|	j|jd f ¡|d W d d }~X Y qrX qrW | j||jd}|r@||d	 | 7 }|d|  |¡ 7 }|S )Nz
CREATE r¬   zTABLE r÷   Ú
F)Úfirst_pkz, 
ú	Tz (in table '%s', column '%s'): %sr   )r  )Ú _include_foreign_key_constraintsz
)%s

)r¡   rw   rÌ  r/   r)  Úcreate_table_suffixrS  r~   Úprimary_keyr   r  r   rÐ   ÚuÚdescriptionr¢   ÚargsÚcreate_table_constraintsZinclude_foreign_key_constraintsÚpost_create_table)r€   r   rG   rw   r*  re  Ú	separatorrb  Zcreate_columnr   Ú	processedZceÚconstrP   rP   rT   Úvisit_create_tableg  sH    

zDDLCompiler.visit_create_tableFc                sL   |j }|jrd S ˆ j||d}d ‡ fdd„|jD ƒ¡}|rH|d| 7 }|S )N)rb  r¬   c             3   s   | ]}ˆ   |¡V  qd S )N)r~   )rR   r   )r€   rP   rT   ré   ¡  s    z2DDLCompiler.visit_create_column.<locals>.<genexpr>)r¡   ÚsystemÚget_column_specificationr/   Úconstraints)r€   r   rb  r   r*  rn  rP   )r€   rT   Úvisit_create_column™  s    zDDLCompiler.visit_create_columnc                st   g }ˆj r| ˆj ¡ ˆj}|d k	r0| |¡‰ ntƒ ‰ | ‡ ‡fdd„ˆjD ƒ¡ d dd„ ‡fdd„|D ƒD ƒ¡S )Nc                s"   g | ]}|ˆj k	r|ˆ kr|‘qS rP   )rf  )rR   r;  )Ú	omit_fkcsrG   rP   rT   rR  º  s   z8DDLCompiler.create_table_constraints.<locals>.<listcomp>z, 
	c             s   s   | ]}|d k	r|V  qd S )NrP   )rR   ÚprP   rP   rT   ré   Á  s   z7DDLCompiler.create_table_constraints.<locals>.<genexpr>c             3   s@   | ]8}|j d ks|  ˆ ¡rˆ jjr.t|ddƒsˆ  |¡V  qd S )NZ	use_alterF)Z_create_ruleru   Zsupports_alterr·   r~   )rR   r   )r€   rP   rT   ré   Ã  s
   

)rf  rl  Zforeign_key_constraintsrÿ  rE   ÚextendZ_sorted_constraintsr/   )r€   rG   rd  rr  Zall_fkcsrP   )rt  r€   rG   rT   rj  ¨  s    
z$DDLCompiler.create_table_constraintsc             C   s   d| j  |j¡ S )Nz
DROP TABLE )rw   r)  r¡   )r€   r_  rP   rP   rT   Úvisit_drop_tableÑ  s    zDDLCompiler.visit_drop_tablec             C   s   d| j  |j¡ S )Nz
DROP VIEW )rw   r)  r¡   )r€   r_  rP   rP   rT   Úvisit_drop_viewÔ  s    zDDLCompiler.visit_drop_viewc             C   s   |j d krt d|j ¡‚d S )Nz,Index '%s' is not associated with any table.)rG   r   r  r¢   )r€   r!  rP   rP   rT   Ú_verify_index_table×  s    
zDDLCompiler._verify_index_tableTc          	      s~   |j }ˆ  |¡ ˆ j}d}|jr(|d7 }|jd kr<t d¡‚|dˆ j||d|j|j	|dd 
‡ fdd	„|jD ƒ¡f 7 }|S )
NzCREATE zUNIQUE z0CREATE INDEX requires that the index have a namezINDEX %s ON %s (%s))Úinclude_schema)r!  z, c             3   s    | ]}ˆ j j|d ddV  qdS )FT)r  r  N)rŠ   r~   )rR   r=  )r€   rP   rT   ré   ð  s   z1DDLCompiler.visit_create_index.<locals>.<genexpr>)r¡   ry  rw   rK   r¢   r   r  Ú_prepared_index_namer)  rG   r/   Zexpressions)r€   r   rz  Zinclude_table_schemar!  rw   r*  rP   )r€   rT   Úvisit_create_indexÝ  s"    



zDDLCompiler.visit_create_indexc             C   s,   |j }|jd krt d¡‚d| j|dd S )Nz.DROP INDEX requires that the index have a namez
DROP INDEX T)rz  )r¡   r¢   r   r  r{  )r€   r_  r!  rP   rP   rT   Úvisit_drop_indexø  s    
zDDLCompiler.visit_drop_indexc             C   sX   |j d k	r| j |j ¡}nd }|r4|r4| j |¡}nd }| j |¡}|rT|d | }|S )Nr  )rG   rw   r  r  Úformat_index)r€   r!  rz  r  Zschema_nameZ
index_namerP   rP   rT   r{    s    
z DDLCompiler._prepared_index_namec             C   s    d| j  |jj¡|  |j¡f S )NzALTER TABLE %s ADD %s)rw   r)  r¡   rG   r~   )r€   r   rP   rP   rT   Ú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)rw   r)  r¡   rŠ   rª  Úcommentr	   ÚString)r€   r   rP   rP   rT   Úvisit_set_table_comment  s    z#DDLCompiler.visit_set_table_commentc             C   s   d| j  |j¡ S )NzCOMMENT ON TABLE %s IS NULL)rw   r)  r¡   )r€   r_  rP   rP   rT   Ú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!  )rw   rÂ  r¡   rŠ   rª  r€  r	   r  )r€   r   rP   rP   rT   Ú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„  )rw   rÂ  r¡   )r€   r_  rP   rP   rT   Úvisit_drop_column_comment0  s    z%DDLCompiler.visit_drop_column_commentc             C   sò   d| j  |j¡ }|jjd k	r.|d|jj 7 }|jjd k	rJ|d|jj 7 }|jjd k	rf|d|jj 7 }|jjd k	r‚|d|jj 7 }|jjd k	r–|d7 }|jjd k	rª|d7 }|jj	d k	rÆ|d|jj	 7 }|jj
d	krÚ|d
7 }|jjd k	rî|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)rw   rQ  r¡   Ú	incrementÚstartZminvalueZmaxvalueZ
nominvalueZ
nomaxvalueÚcacher?   Úcycle)r€   r   r*  rP   rP   rT   Úvisit_create_sequence5  s*    
z!DDLCompiler.visit_create_sequencec             C   s   d| j  |j¡ S )NzDROP SEQUENCE %s)rw   rQ  r¡   )r€   r_  rP   rP   rT   Úvisit_drop_sequenceM  s    zDDLCompiler.visit_drop_sequencec             C   s^   |j }|jd k	r| j |¡}nd }|d kr:t d|j  ¡‚d| j |j j¡||jrVdpXdf S )Nz<Can't emit DROP CONSTRAINT for constraint %r; it has no namez#ALTER TABLE %s DROP CONSTRAINT %s%sz CASCADErŽ   )	r¡   r¢   rw   Úformat_constraintr   r  r)  rG   r^  )r€   r_  r   Úformatted_namerP   rP   rT   Úvisit_drop_constraintP  s    

z!DDLCompiler.visit_drop_constraintc             K   sr   | j  |¡d | jjj|j|d }|  |¡}|d k	rB|d| 7 }|jd k	r`|d|  |j¡ 7 }|jsn|d7 }|S )Nr¬   )r#  z	 DEFAULT z	 NOT NULL)	rw   rÂ  ru   r$  r~   r§   Úget_column_default_stringZcomputedZnullable)r€   r   r   Zcolspecr   rP   rP   rT   rq  b  s    

z$DDLCompiler.get_column_specificationc             C   s   dS )NrŽ   rP   )r€   rG   rP   rP   rT   re  u  s    zDDLCompiler.create_table_suffixc             C   s   dS )NrŽ   rP   )r€   rG   rP   rP   rT   rk  x  s    zDDLCompiler.post_create_tablec             C   sP   t |jtjƒrHt |jjtjƒr2| j |jjt	j
¡S | jj|jjddS nd S d S )NT)r  )r	  Zserver_defaultr   ZDefaultClauseÚargr   Ústring_typesrŠ   rª  r	   rš  r~   )r€   r   rP   rP   rT   r  {  s    z%DDLCompiler.get_column_default_stringc             C   s\   d}|j d k	r.| j |¡}|d k	r.|d| 7 }|d| jj|jddd 7 }||  |¡7 }|S )NrŽ   zCONSTRAINT %s z
CHECK (%s)FT)r  r  )r¢   rw   r  rŠ   r~   rä  Údefine_constraint_deferrability)r€   r   r*  rŽ  rP   rP   rT   Úvisit_check_constraintˆ  s    

z"DDLCompiler.visit_check_constraintc             C   s\   d}|j d k	r.| j |¡}|d k	r.|d| 7 }|d| jj|jddd 7 }||  |¡7 }|S )NrŽ   zCONSTRAINT %s z
CHECK (%s)FT)r  r  )r¢   rw   r  rŠ   r~   rä  r“  )r€   r   r*  rŽ  rP   rP   rT   Úvisit_column_check_constraint”  s    

z)DDLCompiler.visit_column_check_constraintc                s†   t |ƒdkrdS d}|jd k	r>ˆ j |¡}|d k	r>|d| 7 }|d7 }|dd ‡ fdd„|jrd|jn|jD ƒ¡ 7 }|ˆ  |¡7 }|S )	Nr   rŽ   zCONSTRAINT %s zPRIMARY KEY z(%s)z, c             3   s   | ]}ˆ j  |j¡V  qd S )N)rw   r  r¢   )rR   r;  )r€   rP   rT   ré   ª  s   z;DDLCompiler.visit_primary_key_constraint.<locals>.<genexpr>)	rí   r¢   rw   r  r/   Z_implicit_generatedZcolumns_autoinc_firstrS  r“  )r€   r   r*  rŽ  rP   )r€   rT   Úvisit_primary_key_constraint   s    

z(DDLCompiler.visit_primary_key_constraintc          	      s¼   | j ‰ d}|jd k	r4| j  |¡}|d k	r4|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Ž   zCONSTRAINT %s r   z"FOREIGN KEY(%s) REFERENCES %s (%s)z, c             3   s   | ]}ˆ   |jj¡V  qd S )N)r  Úparentr¢   )rR   r  )rw   rP   rT   ré   ¾  s    z;DDLCompiler.visit_foreign_key_constraint.<locals>.<genexpr>c             3   s   | ]}ˆ   |jj¡V  qd S )N)r  r   r¢   )rR   r  )rw   rP   rT   ré   Ä  s    )rw   r¢   r  rÒ   r   r   rG   r/   Údefine_constraint_remote_tableÚdefine_constraint_matchÚdefine_constraint_cascadesr“  )r€   r   r*  rŽ  Zremote_tablerP   )rw   rT   Ú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   rG   rw   rP   rP   rT   r˜  Ì  s    z*DDLCompiler.define_constraint_remote_tablec                sp   t |ƒdkrdS d}|jd k	r>ˆ j |¡}|d k	r>|d| 7 }|dd ‡ fdd„|D ƒ¡ 7 }|ˆ  |¡7 }|S )Nr   rŽ   zCONSTRAINT %s zUNIQUE (%s)z, c             3   s   | ]}ˆ j  |j¡V  qd S )N)rw   r  r¢   )rR   r;  )r€   rP   rT   ré   Ú  s    z6DDLCompiler.visit_unique_constraint.<locals>.<genexpr>)rí   r¢   rw   r  r/   r“  )r€   r   r*  rŽ  rP   )r€   rT   Úvisit_unique_constraintÑ  s    
z#DDLCompiler.visit_unique_constraintc             C   sL   d}|j d k	r&|d| j |j t¡ 7 }|jd k	rH|d| j |jt¡ 7 }|S )NrŽ   z ON DELETE %sz ON UPDATE %s)Zondeleterw   Úvalidate_sql_phraseÚFK_ON_DELETEZonupdateÚFK_ON_UPDATE)r€   r   r*  rP   rP   rT   rš  ß  s    



z&DDLCompiler.define_constraint_cascadesc             C   sL   d}|j d k	r&|j r|d7 }n|d7 }|jd k	rH|d| j |jt¡ 7 }|S )NrŽ   z DEFERRABLEz NOT DEFERRABLEz INITIALLY %s)r    r,   rw   r  ÚFK_INITIALLY)r€   r   r*  rP   rP   rT   r“  ë  s    



z+DDLCompiler.define_constraint_deferrabilityc             C   s    d}|j d k	r|d|j  7 }|S )NrŽ   z	 MATCH %s)Úmatch)r€   r   r*  rP   rP   rT   r™  ø  s    
z#DDLCompiler.define_constraint_matchc             C   sB   d| j j|jddd }|jdkr,|d7 }n|jdkr>|d7 }|S )NzGENERATED ALWAYS AS (%s)FT)r  r  z STOREDz VIRTUAL)rŠ   r~   rä  Z	persisted)r€   Ú	generatedr*  rP   rP   rT   Úvisit_computed_columnþ  s    


z!DDLCompiler.visit_computed_column)N)F)N)FT)F)*r•   r–   r—   r   rJ  rŠ   r$  r   r[  r]  r`  ro  rs  rj  rw  rx  ry  r|  r}  r{  r  r‚  rƒ  r…  r†  r‹  rŒ  r  rq  re  rk  r  r”  r•  r–  r›  r˜  rœ  rš  r“  r™  r£  rP   rP   rP   rT   rT  ;  sJ   
2

(


rT  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   s   dS )NÚFLOATrP   )r€   r   rž   rP   rP   rT   Úvisit_FLOAT
  s    zGenericTypeCompiler.visit_FLOATc             K   s   dS )NZREALrP   )r€   r   rž   rP   rP   rT   Ú
visit_REAL  s    zGenericTypeCompiler.visit_REALc             K   s<   |j d krdS |jd kr&dd|j i S d|j |jdœ S d S )NZNUMERICzNUMERIC(%(precision)s)Ú	precisionz!NUMERIC(%(precision)s, %(scale)s))r¨  Úscale)r¨  r©  )r€   r   rž   rP   rP   rT   Úvisit_NUMERIC  s    

z!GenericTypeCompiler.visit_NUMERICc             K   s<   |j d krdS |jd kr&dd|j i S d|j |jdœ S d S )NZDECIMALzDECIMAL(%(precision)s)r¨  z!DECIMAL(%(precision)s, %(scale)s))r¨  r©  )r¨  r©  )r€   r   rž   rP   rP   rT   Úvisit_DECIMAL  s    

z!GenericTypeCompiler.visit_DECIMALc             K   s   dS )NZINTEGERrP   )r€   r   rž   rP   rP   rT   Úvisit_INTEGER&  s    z!GenericTypeCompiler.visit_INTEGERc             K   s   dS )NZSMALLINTrP   )r€   r   rž   rP   rP   rT   Úvisit_SMALLINT)  s    z"GenericTypeCompiler.visit_SMALLINTc             K   s   dS )NZBIGINTrP   )r€   r   rž   rP   rP   rT   Úvisit_BIGINT,  s    z GenericTypeCompiler.visit_BIGINTc             K   s   dS )NÚ	TIMESTAMPrP   )r€   r   rž   rP   rP   rT   Úvisit_TIMESTAMP/  s    z#GenericTypeCompiler.visit_TIMESTAMPc             K   s   dS )NZDATETIMErP   )r€   r   rž   rP   rP   rT   Úvisit_DATETIME2  s    z"GenericTypeCompiler.visit_DATETIMEc             K   s   dS )NZDATErP   )r€   r   rž   rP   rP   rT   Ú
visit_DATE5  s    zGenericTypeCompiler.visit_DATEc             K   s   dS )NZTIMErP   )r€   r   rž   rP   rP   rT   Ú
visit_TIME8  s    zGenericTypeCompiler.visit_TIMEc             K   s   dS )NZCLOBrP   )r€   r   rž   rP   rP   rT   Ú
visit_CLOB;  s    zGenericTypeCompiler.visit_CLOBc             K   s   dS )NZNCLOBrP   )r€   r   rž   rP   rP   rT   Úvisit_NCLOB>  s    zGenericTypeCompiler.visit_NCLOBc             C   s0   |}|j r|d|j  7 }|jr,|d|j 7 }|S )Nz(%d)z COLLATE "%s")Úlengthr  )r€   r   r¢   r*  rP   rP   rT   Ú_render_string_typeA  s    z'GenericTypeCompiler._render_string_typec             K   s   |   |d¡S )NZCHAR)r·  )r€   r   rž   rP   rP   rT   Ú
visit_CHARJ  s    zGenericTypeCompiler.visit_CHARc             K   s   |   |d¡S )NZNCHAR)r·  )r€   r   rž   rP   rP   rT   Úvisit_NCHARM  s    zGenericTypeCompiler.visit_NCHARc             K   s   |   |d¡S )NZVARCHAR)r·  )r€   r   rž   rP   rP   rT   Úvisit_VARCHARP  s    z!GenericTypeCompiler.visit_VARCHARc             K   s   |   |d¡S )NZNVARCHAR)r·  )r€   r   rž   rP   rP   rT   Úvisit_NVARCHARS  s    z"GenericTypeCompiler.visit_NVARCHARc             K   s   |   |d¡S )NZTEXT)r·  )r€   r   rž   rP   rP   rT   Ú
visit_TEXTV  s    zGenericTypeCompiler.visit_TEXTc             K   s   dS )NZBLOBrP   )r€   r   rž   rP   rP   rT   Ú
visit_BLOBY  s    zGenericTypeCompiler.visit_BLOBc             K   s   d|j rd|j  pd S )NÚBINARYz(%d)rŽ   )r¶  )r€   r   rž   rP   rP   rT   Úvisit_BINARY\  s    z GenericTypeCompiler.visit_BINARYc             K   s   d|j rd|j  pd S )NZ	VARBINARYz(%d)rŽ   )r¶  )r€   r   rž   rP   rP   rT   Úvisit_VARBINARY_  s    z#GenericTypeCompiler.visit_VARBINARYc             K   s   dS )NZBOOLEANrP   )r€   r   rž   rP   rP   rT   Úvisit_BOOLEANb  s    z!GenericTypeCompiler.visit_BOOLEANc             K   s   | j |f|ŽS )N)r½  )r€   r   rž   rP   rP   rT   Úvisit_large_binarye  s    z&GenericTypeCompiler.visit_large_binaryc             K   s   | j |f|ŽS )N)rÁ  )r€   r   rž   rP   rP   rT   Úvisit_booleanh  s    z!GenericTypeCompiler.visit_booleanc             K   s   | j |f|ŽS )N)r³  )r€   r   rž   rP   rP   rT   Ú
visit_timek  s    zGenericTypeCompiler.visit_timec             K   s   | j |f|ŽS )N)r±  )r€   r   rž   rP   rP   rT   Úvisit_datetimen  s    z"GenericTypeCompiler.visit_datetimec             K   s   | j |f|ŽS )N)r²  )r€   r   rž   rP   rP   rT   Ú
visit_dateq  s    zGenericTypeCompiler.visit_datec             K   s   | j |f|ŽS )N)r®  )r€   r   rž   rP   rP   rT   Úvisit_big_integert  s    z%GenericTypeCompiler.visit_big_integerc             K   s   | j |f|ŽS )N)r­  )r€   r   rž   rP   rP   rT   Úvisit_small_integerw  s    z'GenericTypeCompiler.visit_small_integerc             K   s   | j |f|ŽS )N)r¬  )r€   r   rž   rP   rP   rT   Úvisit_integerz  s    z!GenericTypeCompiler.visit_integerc             K   s   | j |f|ŽS )N)r§  )r€   r   rž   rP   rP   rT   Ú
visit_real}  s    zGenericTypeCompiler.visit_realc             K   s   | j |f|ŽS )N)r¦  )r€   r   rž   rP   rP   rT   Úvisit_float€  s    zGenericTypeCompiler.visit_floatc             K   s   | j |f|ŽS )N)rª  )r€   r   rž   rP   rP   rT   Úvisit_numericƒ  s    z!GenericTypeCompiler.visit_numericc             K   s   | j |f|ŽS )N)rº  )r€   r   rž   rP   rP   rT   Úvisit_string†  s    z GenericTypeCompiler.visit_stringc             K   s   | j |f|ŽS )N)rº  )r€   r   rž   rP   rP   rT   Úvisit_unicode‰  s    z!GenericTypeCompiler.visit_unicodec             K   s   | j |f|ŽS )N)r¼  )r€   r   rž   rP   rP   rT   Ú
visit_textŒ  s    zGenericTypeCompiler.visit_textc             K   s   | j |f|ŽS )N)r¼  )r€   r   rž   rP   rP   rT   Úvisit_unicode_text  s    z&GenericTypeCompiler.visit_unicode_textc             K   s   | j |f|ŽS )N)rº  )r€   r   rž   rP   rP   rT   Ú
visit_enum’  s    zGenericTypeCompiler.visit_enumc             K   s   t  d| ¡‚d S )NzKCan't generate DDL for %r; did you forget to specify a type on this Column?)r   r  )r€   r   rž   rP   rP   rT   r>  •  s    zGenericTypeCompiler.visit_nullc             K   s   | j | | j¡f|ŽS )N)r~   Ztype_engineru   )r€   r   rž   rP   rP   rT   Úvisit_type_decoratorœ  s    z(GenericTypeCompiler.visit_type_decoratorc             K   s   |j f |ŽS )N)Zget_col_spec)r€   r   rž   rP   rP   rT   Úvisit_user_definedŸ  s    z&GenericTypeCompiler.visit_user_definedN)-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Ë  rÌ  rÍ  rÎ  rÏ  rÐ  rÑ  r>  rÒ  rÓ  rP   rP   rP   rT   r¤  	  sT   	r¤  c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚStrSQLTypeCompilerc             C   s   |  d¡r| jS t|ƒ‚d S )NZvisit_)Ú
startswithÚ_visit_unknownÚAttributeError)r€   r°   rP   rP   rT   Ú__getattr__¤  s    
zStrSQLTypeCompiler.__getattr__c             K   s   d|j j S )Nz%s)rb  r•   )r€   r   rž   rP   rP   rT   rÖ  ª  s    z!StrSQLTypeCompiler._visit_unknownN)r•   r–   r—   rØ  rÖ  rP   rP   rP   rT   rÔ  £  s   rÔ  c               @   s  e Zd ZdZeZeZeZ	e
 d¡Zd5dd„Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd6dd„Zd7dd„Zdd„ Zd8dd„Zd9dd„Zd:d d!„Zd;d"d#„Ze d$¡d%d&„ ƒZd'd(„ Zd<d)d*„Z d+d,„ Z!d=d-d.„Z"d>d/d0„Z#ej$d1d2„ ƒZ%d3d4„ Z&dS )?ÚIdentifierPreparerz@Handle quoting and case-folding of identifiers based on options.Nú"TFc             C   sN   || _ || _|p| j| _|| _| jd | _|| _|| _i | _| j jdk| _	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   )rZ   rY   N)
ru   Úinitial_quoteÚfinal_quoteÚescape_quoteÚescape_to_quoteÚomit_schemaÚquote_case_sensitive_collationsÚ_stringsr¾   r(  )r€   ru   rÛ  rÜ  rÝ  rà  rß  rP   rP   rT   r‚   º  s    zIdentifierPreparer.__init__c             C   s,   | j  | j ¡}|j | j¡ t |¡|_|S )N)rb  Ú__new__Ú__dict__rß  r   Ú_schema_getterr  )r€   rx   ÚpreprP   rP   rT   ry   Þ  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'  z%%)r)  rÝ  rÞ  r(  )r€   r²   rP   rP   rT   Ú_escape_identifierä  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)  rÞ  rÝ  )r€   r²   rP   rP   rT   Ú_unescape_identifierð  s    z'IdentifierPreparer._unescape_identifierc             C   s*   |dk	r&|  |¡s&t d||jf ¡‚|S )zýkeyword sequence filter.

        a filter for elements that are intended to represent keyword sequences,
        such as "INITIALLY", "INITIALLY DEFERRED", etc.   no special characters
        should be present.

        .. versionadded:: 1.3

        Nz/Unexpected SQL phrase: %r (matching against %r))r¡  r   r  Úpattern)r€   r¡   ÚregrP   rP   rT   r  ù  s
    z&IdentifierPreparer.validate_sql_phrasec             C   s   | j |  |¡ | j S )z~Quote an identifier.

        Subclasses should override this to provide database-dependent
        quoting behavior.
        )rÛ  ræ  rÜ  )r€   r²   rP   rP   rT   Úquote_identifier  s    
z#IdentifierPreparer.quote_identifierc             C   s<   |  ¡ }|| jkp:|d | jk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²   Zlc_valuerP   rP   rT   rÎ    s
    
z#IdentifierPreparer._requires_quotesc             C   s   | j  t |¡¡ S )zjReturn True if the given identifier requires quoting, but
        not taking case convention into account.)rí  r¡  r   rî  )r€   r²   rP   rP   rT   r]  "  s    z1IdentifierPreparer._requires_quotes_illegal_charsc             C   s   |dk	rt  d¡ |  |¡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: unused

            .. deprecated:: 0.9

                The :paramref:`.IdentifierPreparer.quote_schema.force`
                parameter is deprecated and will be removed in a future
                release.  This flag has no effect on the behavior of the
                :meth:`.IdentifierPreparer.quote` method; please refer to
                :class:`.quoted_name`.

        NzÚThe IdentifierPreparer.quote_schema.force parameter is deprecated and will be removed in a future release.  This flag has no effect on the behavior of the IdentifierPreparer.quote method; please refer to quoted_name().)r   Úwarn_deprecatedr  )r€   r   ÚforcerP   rP   rT   r  '  s    zIdentifierPreparer.quote_schemac             C   s‚   |dk	rt  d¡ t|ddƒ}|dkrl|| jkr:| j| S |  |¡rV|  |¡| j|< n
|| j|< | j| S n|rz|  |¡S |S d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: unused

            .. deprecated:: 0.9

                The :paramref:`.IdentifierPreparer.quote.force`
                parameter is deprecated and will be removed in a future
                release.  This flag has no effect on the behavior of the
                :meth:`.IdentifierPreparer.quote` method; please refer to
                :class:`.quoted_name`.

        NzÓThe IdentifierPreparer.quote.force parameter is deprecated and will be removed in a future release.  This flag has no effect on the behavior of the IdentifierPreparer.quote method; please refer to quoted_name().r  )r   rï  r·   rá  rÎ  rê  )r€   r±   rð  rP   rP   rT   r  L  s    




zIdentifierPreparer.quotec             C   s   | j r|  |¡S |S d S )N)rà  r  )r€   Zcollation_namerP   rP   rT   r  ~  s    
z#IdentifierPreparer.format_collationc             C   s>   |   |j¡}|  |¡}| js:|r:|d k	r:|  |¡d | }|S )Nr  )r  r¢   r  rß  r  )r€   rg  r!  r¢   r  rP   rP   rT   rQ  „  s    
z"IdentifierPreparer.format_sequencec             C   s   |   |p|j¡S )N)r  r¢   )r€   r    r¢   rP   rP   rT   r  ‘  s    zIdentifierPreparer.format_labelc             C   s   |   |p|j¡S )N)r  r¢   )r€   r  r¢   rP   rP   rT   rÅ  ”  s    zIdentifierPreparer.format_aliasc             C   s"   |p|j }|  |¡r|  |¡}|S )N)r±   rÎ  rê  )r€   Z	savepointr¢   r±   rP   rP   rT   rA  —  s    


z#IdentifierPreparer.format_savepointzsqlalchemy.sql.namingc             C   sÆ   t |jtjƒr>| ||j¡}|d krDt |jtjƒr6d S |j}n|j}t |tjƒr°|jdkrl| j	j
ph| j	j}n| j	jpz| j	j}t|ƒ|kr¼|d|d … d t |¡dd …  }n| j	 |¡ |  |¡S )Nr!  r   é   r­   éüÿÿÿ)r	  r¢   r   Z_defer_nameZ_constraint_name_for_tablerG   Z_defer_none_namer
  r©   ru   Zmax_index_name_lengthrÄ   Zmax_constraint_name_lengthrí   r   Zmd5_hexZvalidate_identifierr  )r€   Znamingr   r¢   Zmax_rP   rP   rT   r     s$    


(z$IdentifierPreparer.format_constraintc             C   s
   |   |¡S )N)r  )r€   r!  rP   rP   rT   r~  Ä  s    zIdentifierPreparer.format_indexc             C   sF   |dkr|j }|  |¡}|  |¡}| jsB|rB|rB|  |¡d | }|S )z'Prepare a quoted table and schema name.Nr  )r¢   r  r  rß  r  )r€   rG   r!  r¢   rõ   r  rP   rP   rT   r)  Ç  s    

zIdentifierPreparer.format_tablec             C   s
   |   |¡S )zPrepare a quoted schema name.)r  )r€   r¢   rP   rP   rT   r\  Ô  s    z IdentifierPreparer.format_schemac             C   sp   |dkr|j }t|ddƒsJ|r>| j|j||dd |  |¡ S |  |¡S n"|rh| j|j||dd | S |S dS )zPrepare a quoted column name.Nr  F)r!  r¢   r  )r¢   r·   r)  rG   r  )r€   r   r„  r¢   Z
table_namer!  rP   rP   rT   rÂ  Ù  s    
 z IdentifierPreparer.format_columnc             C   sD   |   |¡}| js0|r0|r0|  |¡| j|ddfS | j|ddfS dS )z(Format table name and schema as a tuple.F)r!  N)r  rß  r  r)  )r€   rG   r!  r  rP   rP   rT   rX  ÿ  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 rP   )rç   r¨  )rR   rD  rP   rP   rT   rR    s   z5IdentifierPreparer._r_identifiers.<locals>.<listcomp>zM(?:(?:%(initial)s((?:%(escaped)s|[^%(final)s])+)%(final)s|([^\.]+))(?=\.|$))+)ÚinitialÚfinalÚescaped)rÛ  rÜ  ræ  rç   rƒ   )r€   ró  rô  Zescaped_finalÚrrP   rP   rT   Ú_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 rP   )rç  )rR   rk  )r€   rP   rT   rR  '  s   z;IdentifierPreparer.unformat_identifiers.<locals>.<listcomp>c             S   s   g | ]\}}|p|‘qS rP   rP   )rR   ÚaÚbrP   rP   rT   rR  (  s    )r÷  Úfindall)r€   Zidentifiersrö  rP   )r€   rT   Úunformat_identifiers"  s    
z'IdentifierPreparer.unformat_identifiers)rÚ  NrÚ  TF)N)N)T)N)N)N)TN)FNNF)T)'r•   r–   r—   r˜   ÚRESERVED_WORDSrë  ÚLEGAL_CHARACTERSrí  ÚILLEGAL_INITIAL_CHARACTERSrì  r   rä  r  r‚   ry   ræ  rç  r  rê  rÎ  r]  r  r  r  rQ  r  rÅ  rA  r   rK  r  r~  r)  r\  rÂ  rX  rJ  r÷  rû  rP   rP   rP   rT   rÙ  ®  sF   
    
	

%
2



	$
   
 
rÙ  )lr˜   rH  rå   rç   rŽ   r   r   r   r   r   r   r	   r
   r   r   rE   rü  rƒ   ÚIrý  ZLEGAL_CHARACTERS_PLUS_SPACEÚrangerJ   rþ  rž  rŸ  r   ÚUNICODEr1  r0  rÀ   Úand_Úor_ÚaddÚmulrè   ÚdivÚmodÚtruedivÚnegÚltÚleÚneÚgtÚgeÚeqZis_distinct_fromZisnot_distinct_fromZ	concat_opr†  Znotmatch_opZin_opZnotin_opZcomma_opr  r  Úis_Zisnotr   ÚexistsZdistinct_opÚinvZany_opZall_opZdesc_opZasc_opZnullsfirst_opZnullslast_opr  r^   r   r   r   r   r4   r5   r_   r`   rD   rL   ZcubeZrollupZgrouping_setsra  rF  rÈ  rq   Z	UNION_ALLrr   Z
EXCEPT_ALLrs   ZINTERSECT_ALLrG  Úobjectrt   Úwith_metaclassZEnsureKWArgTyperœ   Z	VisitablerŸ   rë   r«   r´   rM  rT  r¤  rÔ  rÙ  rP   rP   rP   rT   Ú<module>   sÈ  



                   LB   Q 