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"dej#dej$dej%dej&dej'dej(dej)dej*dej+dej,dej-dej.dej/dej0dej1dej2dej3dej4dej5dej6dej7dej8dej9dej:dej;dej<dej=dej>dej?dej@dejAdejBdejCdi%ZDejEdejFdejGdejHdejIdejJdejKdejLdejMdejNdejOdejPdejQdejRdiZSddddddddddddddddZTe
jUjVde
jUjWde
jUjXde
jUjYde
jUjZde
jUj[diZ\G ddƄ de]Z^G ddȄ de_ej`e]ZaG ddʄ dejbZcG dd̄ de^ZdG dd΄ dedZeG ddЄ de^ZfG dd҄ deaZgG ddԄ degZhG ddք de]Zid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anyZarrayasZascZ
asymmetricZauthorizationZbetweenbinaryZbothZcasecastZcheckcollatecolumn
constraintcreateZcrosscurrent_dateZcurrent_rolecurrent_timecurrent_timestampcurrent_userdefault
deferrableZdescZdistinctZdoelseendexceptfalseforZforeignZfreezefromfullZgrantgroupZhavingZilikein	initiallyinnerZ	intersectZintoisZisnulljoinZleadingleftZlikelimit	localtimelocaltimestampZnaturalnewnotZnotnullZnullZoffoffsetoldZonZonlyororderZouterZoverlapsZplacingZprimaryZ
referencesrightselectsession_usersetZsimilarZsome	symmetrictableZthentoZtrailingtrueunionuniqueuserZusingverboseZwhenwherez^[A-Z0-9_$]+$z^[A-Z0-9_ $]+$c             C   s   h | ]}t |qS  )str).0xrB   rB   6lib/python3.7/site-packages/sqlalchemy/sql/compiler.py	<setcomp>   s    rG   
   $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numericZ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_USERZUSERZCUBEZROLLUPzGROUPING SETSmonthdayyearsecondhourdoyminutequarterdowweekepochmillisecondsmicrosecondstimezone_hourtimezone_minute)rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   UNIONz	UNION ALLEXCEPTz
EXCEPT ALL	INTERSECTzINTERSECT ALLc               @   s   e Zd ZdZdZe Zdde fddZe	dddd Z
d	d
 Zedd Zdd Zdd ZdddZedd Zdd Zdd ZdS )Compileda  Represent a compiled SQL or DDL expression.

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

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

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

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

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

         .. versionadded:: 1.1

         .. seealso::

            :ref:`schema_translating`

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


        N)dialectbindZidentifier_preparerpreparer_with_schema_translate	statementZsupports_executioncan_execute_execution_optionsexecution_optionsprocessstring)selfre   ri   rf   schema_translate_mapZcompile_kwargsrB   rB   rF   __init__  s     
zCompiled.__init__z0.7zThe :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 )zDProduce the internal string representation of this element.
        NrB   )ro   rB   rB   rF   compileA  s    
zCompiled.compilec             C   s$   | j r|| ||S t| jd S )N)rj   _execute_compiledr   ZObjectNotExecutableErrorri   )ro   Z
connectionmultiparamsparamsrB   rB   rF   _execute_on_connectionM  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)ro   rB   rB   rF   sql_compilerS  s    zCompiled.sql_compilerc             K   s   |j | f|S )N)_compiler_dispatch)ro   objkwargsrB   rB   rF   rm   ]  s    zCompiled.processc             C   s
   | j pdS )z3Return the string text of the generated SQL or DDL. )rn   )ro   rB   rB   rF   __str__`  s    zCompiled.__str__c             C   s
   t  dS )zReturn 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)rw   )ro   ru   rB   rB   rF   construct_paramse  s    zCompiled.construct_paramsc             C   s   |   S )z0Return the bind params for this compiled object.)r~   )ro   rB   rB   rF   ru   o  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)rf   r   ZUnboundExecutionErrorrs   )ro   rt   ru   erB   rB   rF   executet  s    zCompiled.executec             O   s   | j || S )zJExecute this compiled object and return the result's
        scalar value.)r   scalar)ro   rt   ru   rB   rB   rF   r     s    zCompiled.scalar)N)__name__
__module____qualname____doc__Z_cached_metadatar   immutabledictrl   rq   Z
deprecatedrr   rv   propertyrx   rm   r}   r~   ru   r   r   rB   rB   rB   rF   rd      s"   
)



rd   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)re   )ro   re   rB   rB   rF   rq     s    zTypeCompiler.__init__c             K   s   |j | f|S )N)ry   )ro   type_kwrB   rB   rF   rm     s    zTypeCompiler.processN)r   r   r   r   Zensure_kwargrq   rm   rB   rB   rB   rF   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namerB   c             C   s   || _ || _|f| | _d S )N)r   r   
_alt_names)ro   colr   	alt_namesrB   rB   rF   rq     s    z_CompileLabel.__init__c             C   s   | j jS )N)r   	proxy_set)ro   rB   rB   rF   r     s    z_CompileLabel.proxy_setc             C   s   | j jS )N)r   type)ro   rB   rB   rF   r     s    z_CompileLabel.typec             K   s   | S )NrB   )ro   r   rB   rB   rF   
self_group  s    z_CompileLabel.self_groupN)rB   )r   r   r   r   __visit_name__	__slots__rq   r   r   r   r   rB   rB   rB   rF   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ZdddZedd	 Zejd
d Zejdd Zdd Zej dd Z!dd Z"edd Z#dddZ$edd Z%e&ddd Z'dd Z(ddd Z)dd!d"Z*dd#d$Z+d	d%d&Z,d'd( Z-d
d)d*Z.d+d, Z/d-d. Z0d/d0 Z1d1d2 Z2d3d4 Z3d5d6 Z4d7d8 Z5dd9d:Z6d;d< Z7d=d> Z8d?d@ Z9dAdB Z:dCdD Z;dEdF Z<dGdH Z=dIdJ Z>dKdL Z?dMdN Z@dOdP ZAdQdR ZBddSdTZCdUdV ZDdWdX ZEdYdZ ZFdd\d]ZGd^d_ ZHd`da ZIdbdc ZJddde ZKdfdg ZLdhdi ZMdjdk ZNdldm ZOdndo ZPddpdqZQdrds ZRdtdu ZSdvdw ZTdxdy ZUdzd{ ZVdd|d}ZWd~d ZXdd ZYej dd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd ZfdddZgdd Zhdd Zidd Zjdd Zkdd Zldd ZmdddZndddZodddZpdd ZqdddZrdd Zsdd ZtdddZudd Zvdd Zwdd Zxdd ZyddÄ Zzddń Z{ddǄ Z|e}de~ fde~ fgZddd˄Zddd̈́Zddτ Zddф Zddӄ ZddՄ Zddׄ Zddل Zddۄ Zdd݄ Zdd߄ Zdd Zdd Zdd ZdddZdddZdd ZdddZdd Zdd Zdd ZdddZej dd Zdd Zdd ZdddZdd Zd d Zdd ZdS (  SQLCompilerzsDefault implementation of :class:`.Compiled`.

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

    FNTrB   c             K   s   || _ |pt|dd| _i | _t | _g | _g | _|j	| _	| j	rTg | _
|jdk| _t|j | _d| _|jpp|j| _t| j| _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:`.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.

        inlineFrM   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_lengthZPopulateDict_process_anonanon_maptruncated_namesrd   rq   isinsertisupdateisdelete
_returning	returning_apply_numbered_params)ro   re   ri   r   r   r{   rB   rB   rF   rq     s*    
zSQLCompiler.__init__c             C   s   t | j| j S )N)listinsert_prefetchupdate_prefetch)ro   rB   rB   rF   prefetch<  s    zSQLCompiler.prefetchc             C   s&   t  | _i | _d| _| jr"i | _dS )zInitialize 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)ro   rB   rB   rF   _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'FTneed_result_map_for_nestedN)r   _ordered_columnsr   pop)ro   Zresult_columnsZordered_columnsentryrB   rB   rF   _nested_resultN  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)rC   r   next)m)poscountrB   rF   <lambda>i  s    z4SQLCompiler._apply_numbered_params.<locals>.<lambda>)	itertoolscountresubrn   )ro   rB   )r   rF   r   f  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 )NrB   )rD   keyvaluerB   rB   rF   	<genexpr>o  s   z/SQLCompiler._bind_processors.<locals>.<genexpr>c             3   s&   | ]} j | |j jfV  qd S )N)r   r   Z_cached_bind_processorre   )rD   	bindparam)ro   rB   rF   r   q  s   )dictr   )ro   rB   )ro   rF   _bind_processorsl  s    
zSQLCompiler._bind_processorsc             C   s   t | jdkS )Nr   )lenr   )ro   rB   rB   rF   is_subqueryz  s    zSQLCompiler.is_subqueryc             C   s   | S )NrB   )ro   rB   rB   rF   rx   }  s    zSQLCompiler.sql_compilerc             C   s2  |ri }x| j D ]}| j | }|j|kr8||j ||< q||krN|| ||< q|r|jr|rvtjd|j|f ddqtjd|j ddq|jr|j||< q|j||< qW |S i }xt| j D ]j}|r|jr|rtjd|j|f ddntjd|j dd|jr|j|| j | < q|j|| j | < qW |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   Zrequiredr   ZInvalidRequestErrorcallableeffective_valuer   )ro   ru   Z_group_number_checkZpdr   r   rB   rB   rF   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~   )ro   rB   rB   rF   ru     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   )ro   resultrB   rB   rF   r     s    zSQLCompiler._create_result_mapc             C   s   dS )zCalled 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|   rB   )ro   rB   rB   rF   default_from  s    zSQLCompiler.default_fromc             K   s   d|j j| f| d S )N())r   ry   )ro   Zgroupingasfromr{   rB   rB   rF   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   re   Zsupports_simple_order_by_label_label_resolve_dictr   Z_order_by_label_elementr   Zshares_lineagerm   )
ro   r   r   r{   r   	with_cols
only_froms	only_colsZresolve_dictZorder_by_elemrB   rB   rF   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 n& tk
rp   t|jtj	d Y n X ||d< | j|fd|i|S d S )Nr   r   z6Can't resolve label reference for ORDER BY / GROUP BY.r   r   )
r   rm   Z_text_clauser   r   KeyErrorr   Z_no_text_coercionr   CompileError)	ro   r   r   r{   r   r   r   r   r   rB   rB   rF   visit_textual_label_reference  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   ry   	OPERATORSr   as_rg   format_label)
ro   r   add_to_result_mapr   r   r   r   Zrender_label_with_asZrender_label_onlyZ	labelnamerB   rB   rF   visit_label  s$    
2zSQLCompiler.visit_labelc             C   s   t dd S )Nz:Cannot compile Column object until its 'name' is assigned.)r   r   )ro   r   rB   rB   rF   _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_columnrg   quoter:   Znamed_with_columnschema_for_objectquote_schema)ro   r   r   include_tabler{   r   Z	orig_namer   r:   effective_schemaZschema_prefixZ	tablenamerB   rB   rF   visit_columnB  s.    

zSQLCompiler.visit_columnc             K   s   | j |jS )N)rg   format_collation	collation)ro   r   r   rB   rB   rF   visit_collationh  s    zSQLCompiler.visit_collationc             K   s   |j S )N)r   )ro   Z
fromclauser{   rB   rB   rF   visit_fromclausek  s    zSQLCompiler.visit_fromclausec             K   s   |j S )N)r   )ro   indexr{   rB   rB   rF   visit_indexn  s    zSQLCompiler.visit_indexc             K   s   ||d< | j jj|jf|S )Ntype_expression)re   type_compilerrm   r   )ro   
typeclauser   rB   rB   rF   visit_typeclauseq  s    zSQLCompiler.visit_typeclausec             C   s   | j jr|dd}|S )N%z%%)rg   _double_percentsreplace)ro   textrB   rB   rF   post_process_textu  s    zSQLCompiler.post_process_textc             C   s   | j jr|dd}|S )Nr  z%%)rg   r  r  )ro   r  rB   rB   rF   r   z  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_bindparamsrm   bindparam_string)r   r   )r   ro   
textclauserB   rF   do_bindparam  s    

z2SQLCompiler.visit_textclause.<locals>.do_bindparamTc             S   s
   |  dS )Nr   )r%   )r   rB   rB   rF   r     s    z.SQLCompiler.visit_textclause.<locals>.<lambda>)r   isplaintextBIND_PARAMS_ESCr   BIND_PARAMSr  r  )ro   r
  r   r  rB   )r   ro   r
  rF   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|rd|
 }
|
S )	Nr   r   need_result_map_for_compoundFr   T)r   r   z(%s))
r   _default_stack_entrygetr   r   _textual_ordered_columnsZcolumn_argsrm   _add_to_result_mapr   )ro   Ztafcompound_indexr   parensr   toplevelr   populate_result_mapcr  rB   rB   rF   visit_text_as_from  s"    zSQLCompiler.visit_text_as_fromc             K   s   dS )NZNULLrB   )ro   exprr   rB   rB   rF   
visit_null  s    zSQLCompiler.visit_nullc             K   s   | j jrdS dS d S )Nr<   1)re   supports_native_boolean)ro   r  r   rB   rB   rF   
visit_true  s    zSQLCompiler.visit_truec             K   s   | j jrdS dS d S )Nr!   0)re   r  )ro   r  r   rB   rB   rF   visit_false  s    zSQLCompiler.visit_falsec                sD   |j }|d krd}n
t|j  }|dd  fdd|jD D S )N c             s   s   | ]}|r|V  qd S )NrB   )rD   srB   rB   rF   r     s   z/SQLCompiler.visit_clauselist.<locals>.<genexpr>c             3   s   | ]}|j f V  qd S )N)ry   )rD   r  )r   ro   rB   rF   r     s    )operatorr   r*   clauses)ro   Z
clauselistr   seprB   )r   ro   rF   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   ry   ZwhensZelse_)ro   clauser{   rE   Zcondr   rB   rB   rF   
visit_case  s    
.
zSQLCompiler.visit_casec             K   s   |j j| f|S )N)Ztyped_expressionry   )ro   Ztype_coercer   rB   rB   rF   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))r(  ry   r  )ro   r   r{   rB   rB   rF   
visit_cast  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rdn\|d t jkrdnJ|d dk rd| 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_CURRENTrm   literalabs)ro   range_r   rB   rB   rF   _format_frame_clause  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   ry   )rD   Zwordr(  )r{   ro   rB   rF   
<listcomp>  s   z*SQLCompiler.visit_over.<locals>.<listcomp>Z	PARTITIONZORDER)r.  r/  Zrowsr   ry   r*   Zpartition_byorder_by)ro   Zoverr{   r.  rB   )r{   ro   rF   
visit_over  s    zSQLCompiler.visit_overc             K   s$   d|j j| f||jj| f|f S )Nz%s WITHIN GROUP (ORDER BY %s))r   ry   r1  )ro   Zwithingroupr{   rB   rB   rF   visit_withingroup  s    zSQLCompiler.visit_withingroupc             K   s$   d|j j| f||jj| f|f S )Nz%s FILTER (WHERE %s))funcry   Z	criterion)ro   Z
funcfilterr{   rB   rB   rF   visit_funcfilter$  s    zSQLCompiler.visit_funcfilterc             K   s*   | j |j|j}d||jj| f|f S )NzEXTRACT(%s FROM %s))extract_mapr  fieldr  ry   )ro   extractr{   r7  rB   rB   rF   visit_extract*  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 }n*|j } j	|r j
|n|}|d }d fdd|jD |g d j|f|i S d S )NrB   zvisit_%s_funcz%(expr)sr   c                s(   g | ] } j |r  j |n|qS rB   )rg   _requires_quotes_illegal_charsr   )rD   tok)ro   rB   rF   r0  G  s   z.SQLCompiler.visit_function.<locals>.<listcomp>r  )r   r   r   lower	FUNCTIONSr  	__class__Z	_has_argsrg   r:  r   r*   Zpackagenamesfunction_argspec)ro   r4  r   r{   dispr   rB   )ro   rF   visit_function1  s$    

zSQLCompiler.visit_functionc             K   s   |  |jS )N)visit_sequencesequence)ro   Z
next_valuer   rB   rB   rF   visit_next_value_funcQ  s    z!SQLCompiler.visit_next_value_funcc             K   s   t d| jj d S )Nz2Dialect '%s' does not support sequence increments.)rw   re   r   )ro   rC  r   rB   rB   rF   rB  T  s    zSQLCompiler.visit_sequencec             K   s   |j j| f|S )N)Zclause_exprry   )ro   r4  r{   rB   rB   rF   r?  Z  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pd7 }
jr|r |
 }
j d  r |r d|
 d S |
S d S )Nr   r   r  Fcorrelate_fromsasfrom_froms)rE  rF  r   r  r"  c             3   s,   | ]$\}}|j f d |dV  qdS )F)r   r  r  N)ry   )rD   ir  )r   r{   ro   rB   rF   r   t  s   z4SQLCompiler.visit_compound_select.<locals>.<genexpr>r   r|   r   r   )r   r  r  appendcompound_keywordskeywordr*   	enumerateselectsgroup_by_clauser   order_by_clause_limit_clause_offset_clauselimit_clauser   _render_cte_clauser   )ro   Zcsr   r  r  r{   r  r   Zneed_result_maprJ  r  rB   )r   r{   ro   rF   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%s_r|   )r   r   )ro   	operator_Z
qualifier1Z
qualifier2ZattrnamerB   rB   rF   _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unaryr$  modifierz,Unary expression has no operator or modifier)r$  rX  r   r   rV   _generate_generic_unary_operatorr    _generate_generic_unary_modifier)ro   rW  r   r@  rB   rB   rF   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_booleanre   r  rm   r   )ro   r   r$  r   rB   rB   rF   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\  re   r  rm   r   )ro   r   r$  r   rB   rB   rF   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)ro   r   r$  r   rB   rB   rF   visit_notmatch_op_binary  s    z$SQLCompiler.visit_notmatch_op_binaryc             C   s   t d d S )NzThe 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)ro   rB   rB   rF   _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)re   _use_static_in_warn_on_empty_inrd  rm   r+   )ro   r   r$  r   rB   rB   rF   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)re   re  rf  rd  rm   r+   )ro   r   r$  r   rB   rB   rF   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.)rw   re   r   )ro   Zelement_typesrB   rB   rF   visit_empty_set_expr  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 n  t	k
r   t
| |Y nX | j||f|S d S )NTliteral_bindsr   )ansi_bind_rulesr   r+   r   ZBindParameterr5   r$  rV  r   r   r   ZUnsupportedCompilationError_generate_generic_binary)ro   r   r_  eager_groupingr   rU  r@  opstringrB   rB   rF   r`    s    
zSQLCompiler.visit_binaryc             K   s   | j |jf|S )N)rm   Zsql_function)ro   r   r$  r   rB   rB   rF   &visit_function_as_comparison_op_binary  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 % )rg   r  rm   r+   r5   )ro   r   r$  r   rB   rB   rF   visit_mod_binary  s    $zSQLCompiler.visit_mod_binaryc             K   s$   |j |d< | j|d|j d f|S )Nrm  r"  )rm  rl  rn  )ro   r   r$  r   rB   rB   rF   visit_custom_op_binary  s    
z"SQLCompiler.visit_custom_op_binaryc             K   s   | j ||jd f|S )Nr"  )rY  rn  )ro   r   r$  r   rB   rB   rF   visit_custom_op_unary_operator  s    z*SQLCompiler.visit_custom_op_unary_operatorc             K   s   | j |d|j f|S )Nr"  )rZ  rn  )ro   r   r$  r   rB   rB   rF   visit_custom_op_unary_modifier!  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_binaryFTrm  z(%s))r  r+   ry   r5   )ro   r   rn  rm  r   rt  r  rB   rB   rF   rl  &  s     z$SQLCompiler._generate_generic_binaryc             K   s   ||j j| f| S )N)r   ry   )ro   rW  rn  r   rB   rB   rF   rY  ;  s    z,SQLCompiler._generate_generic_unary_operatorc             K   s   |j j| f|| S )N)r   ry   )ro   rW  rn  r   rB   rB   rF   rZ  >  s    z,SQLCompiler._generate_generic_unary_modifierc             C   s   t jdtjdS )Nz'%')r   )r   Zliteral_columnr	   
STRINGTYPE)ro   rB   rB   rF   _like_percent_literalA  s    z!SQLCompiler._like_percent_literalc             K   s2   |  }| j}||j||_| j||f|S )N)_clonerv  __add__r5   visit_like_op_binary)ro   r   r$  r   percentrB   rB   rF   visit_contains_op_binaryE  s    z$SQLCompiler.visit_contains_op_binaryc             K   s2   |  }| j}||j||_| j||f|S )N)rw  rv  rx  r5   visit_notlike_op_binary)ro   r   r$  r   rz  rB   rB   rF   visit_notcontains_op_binaryK  s    z'SQLCompiler.visit_notcontains_op_binaryc             K   s,   |  }| j}||j|_| j||f|S )N)rw  rv  __radd__r5   ry  )ro   r   r$  r   rz  rB   rB   rF   visit_startswith_op_binaryQ  s    z&SQLCompiler.visit_startswith_op_binaryc             K   s,   |  }| j}||j|_| j||f|S )N)rw  rv  r~  r5   r|  )ro   r   r$  r   rz  rB   rB   rF   visit_notstartswith_op_binaryW  s    z)SQLCompiler.visit_notstartswith_op_binaryc             K   s,   |  }| j}||j|_| j||f|S )N)rw  rv  rx  r5   ry  )ro   r   r$  r   rz  rB   rB   rF   visit_endswith_op_binary]  s    z$SQLCompiler.visit_endswith_op_binaryc             K   s,   |  }| j}||j|_| j||f|S )N)rw  rv  rx  r5   r|  )ro   r   r$  r   rz  rB   rB   rF   visit_notendswith_op_binaryc  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  r+   ry   r5   render_literal_valuer	   ru  )ro   r   r$  r   r  rB   rB   rF   ry  i  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  r+   ry   r5   r  r	   ru  )ro   r   r$  r   r  rB   rB   rF   r|  v  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  r+   ry   r5   r  r	   ru  )ro   r   r$  r   r  rB   rB   rF   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  r+   ry   r5   r  r	   ru  )ro   r   r$  r   r  rB   rB   rF   visit_notilike_op_binary  s    z$SQLCompiler.visit_notilike_op_binaryc             K   s&   |j dd}| j||rdndf|S )Nr9   Fz BETWEEN SYMMETRIC z	 BETWEEN )r  r  rl  )ro   r   r$  r   r9   rB   rB   rF   visit_between_op_binary  s    z#SQLCompiler.visit_between_op_binaryc             K   s&   |j dd}| j||rdndf|S )Nr9   Fz NOT BETWEEN SYMMETRIC z NOT BETWEEN )r  r  rl  )ro   r   r$  r   r9   rB   rB   rF   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st	
d|j n"|	js|jrt	
d|j|jf | | j|j< | j|< | j|fd|ji|S )NT)skip_bind_expressionr   rj  z@Bind parameter '%s' without a renderable value not allowed here.r   zIBind parameter '%s' conflicts with unique bind parameter of the same namezbindparam() 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_implre   Z_has_bind_expressionbind_expressionrm   rk  r   r   r   r   r   render_literal_bindparam_truncate_bindparamr   r>   r   intersectionZ_is_crudr	  r  )
ro   r   r   rj  r  r{   implr  r   existingrB   rB   rF   visit_bindparam  sB    	




zSQLCompiler.visit_bindparamc             K   s   |j }| ||jS )N)r   r  r   )ro   r   r   r   rB   rB   rF   r    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_processorre   rw   )ro   r   r   Z	processorrB   rB   rF   r    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   )ro   r   Z	bind_namerB   rB   rF   r    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   rT  r   )r   Z	apply_mapr   r   r   r  maxhex)ro   Zident_classr   ZanonnameZcounterZ	truncnamerB   rB   rF   r     s    ,z!SQLCompiler._truncated_identifierc             C   s
   || j  S )N)r   )ro   r   rB   rB   rF   
_anonymize  s    zSQLCompiler._anonymizec             C   s<   | dd\}}| j|d}|d | j|< |d t| S )Nr"  r   rT  )splitr   r  rC   )ro   r   identZderivedZanonymous_counterrB   rB   rF   r     s    zSQLCompiler._process_anonc             K   sJ   | j r&|d k	r|| n| j| |r8d| _d| S | jd|i S d S )NTz([EXPANDING_%s])r   )r   rH  r   contains_expanding_parametersr   )ro   r   positional_namesr  r   rB   rB   rF   r	  "  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 }|rD| j|< d|jjkrd jkr jd|jjd i _| jkr2 j|f| |sD| jkrD|jrRd _ j||}|jrt|jtjr|j}n(t|jtjr|jjd }n
dstdd	 t|jD }|d
d fdd|D  7 } jrg  |d<  j |< |d|jj! fddi| 7 }|j"r:|d j#||j"f| 7 }| j|< |r|sd|	rd 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 )NrB   )rD   r  rB   rB   rF   r0    s   z)SQLCompiler.visit_cte.<locals>.<listcomp>z(%s)z, c             3   s   | ]} j |V  qd S )N)rg   format_column)rD   r  )ro   rB   rF   r     s   z(SQLCompiler.visit_cte.<locals>.<genexpr>r  z AS 
r   r"  )'r   r   r   r   r   r   r   Z	_restatesr   r   r   Z
_cte_aliasr   rk   rl   r=   	visit_cte	recursiver   rg   format_aliasoriginalr   SelectCompoundSelectrL  AssertionErrorr   Zunique_listinner_columnsr*   r   r   ry   	_suffixes_generate_prefixes_requires_quotesr   get_render_as_alias_suffix)ro   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_colsrB   )ro   rF   r  0  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   rg   r  r  ry   r  format_from_hint_text)	ro   r   r   r  iscrudr  r{   Z
alias_nameretrB   rB   rF   visit_alias  s     	zSQLCompiler.visit_aliasc             K   s   d|d< d| j |f| S )NTlateralz
LATERAL %s)r  )ro   r  r   rB   rB   rF   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_methodry   Zseed)ro   Ztablesampler   r   r  rB   rB   rF   visit_tablesample  s    
zSQLCompiler.visit_tablesamplec             C   s   d| S )Nz AS rB   )ro   Zalias_name_textrB   rB   rF   r    s    z&SQLCompiler.get_render_as_alias_suffixc             C   s   | j ||||f d S )N)r   rH  )ro   keynamer   objectsr   rB   rB   rF   r    s    zSQLCompiler._add_to_result_mapc                s~   j j}|jr2|r2| }	 fdd}
n }	|rBj}
nd}
|sR|	}nt tjr|	 k	r|t	|	 j
 jfd}n|	}n|dk	r|rt	|	| jfd}n|rt tjr js jdk	rt jtjst	|	t j
 jfd}nvt tjs8t tjr jr8t dr*t tjr8t	|	 j}n*|	 k	r^t	|	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)r  )r  r   r  r   )r   ro   rB   rF   r     s    z;SQLCompiler._label_select_column.<locals>.add_to_result_mapN)r   r   )r   r   )r   r  re   Z_has_column_expressionZcolumn_expressionr  r   r   ZLabelr   r   r   
_key_labelZColumnClauser   r:   r   r  Z_as_truncatedr   Z
TextClauseZUnaryExpressionZwraps_column_expressionhasattrr   ZFunctionZ
anon_labelupdatery   )ro   r6   r   r  r   column_clause_argsr   r   r  Zcol_exprr   Zresult_exprrB   )r   ro   rF   _label_select_column  sV    





z SQLCompiler._label_select_columnc             C   s    |  ||}|r|d| 7 }|S )Nr"  )get_from_hint_text)ro   sqltextr:   Zhintr  hinttextrB   rB   rF   r  5  s    z!SQLCompiler.format_from_hint_textc             C   s   d S )NrB   )ro   ZbyfromsrB   rB   rF   get_select_hint_text;  s    z SQLCompiler.get_select_hint_textc             C   s   d S )NrB   )ro   r:   r  rB   rB   rF   r  >  s    zSQLCompiler.get_from_hint_textc             C   s   d S )NrB   )ro   r:   r  rB   rB   rF   get_crud_hint_textA  s    zSQLCompiler.get_crud_hint_textc             C   s
   d |S )Nr"  )r*   )ro   Z
hint_textsrB   rB   rF   get_statement_hint_textD  s    z#SQLCompiler.get_statement_hint_textc                s"   i  i g fdd|S )zRewrite 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|_qW 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rd|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_clueZcloneZinside_select)rw  Zis_selectableZ_is_joinr   r5   r   ZFromGroupingZ_reset_exportedr+   r  r   r   r  r   r  r   Z_labelr   zipr   itemsr  onclauseZ_is_from_containerZ_copy_internalsZ
_is_selectr  rH  )
r   r   Znewelemr5   Zselectable_r  Ztranslate_dictkvZbarrier_select)clonedcolumn_translatevisitrB   rF   r  Q  sR    

z=SQLCompiler._transform_select_for_nested_joins.<locals>.visitrB   )ro   r6   rB   )r  r  r  rF   "_transform_select_for_nested_joinsG  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  )rD   r  rB   rB   rF   r     s    zESQLCompiler._transform_result_map_for_nested_joins.<locals>.<genexpr>c             3   s   | ]} |j  |fV  qd S )N)r  )rD   r  )	inner_colrB   rF   r     s    c                s2   g | ]*\}}}}||t  fd d|D |fqS )c                s   g | ]}  ||qS rB   )r  )rD   r   )drB   rF   r0    s    zQSQLCompiler._transform_result_map_for_nested_joins.<locals>.<listcomp>.<listcomp>)tuple)rD   r   r   Zobjstyp)r  rB   rF   r0    s   zFSQLCompiler._transform_result_map_for_nested_joins.<locals>.<listcomp>)r   r  r   )ro   r6   transformed_selectrB   )r  r  rF   &_transform_result_map_for_nested_joins  s
    
z2SQLCompiler._transform_result_map_for_nested_joinsrE  rF  c       	      C   s\   | j  }|r| jn| j d }|d }|d }|rJ|sJ|j||dd}n|j||d}|S )Nr   rE  rF  rB   )explicit_correlate_fromsimplicit_correlate_froms)r   r  _get_display_froms
difference)	ro   r6   r   r  r  r   rE  rF  fromsrB   rB   rF   _display_froms_for_select  s    
z%SQLCompiler._display_froms_for_selectc	                sf  j o| oj ojj }
|
rJ}j|f |||dd|	}j }|r\jnjd }|p|dkr~|ddp|ddsd|	kr|	d= |
rr| |S 	| |}|	
 ddd	 d
}jr
\}}|r||d 7 }nd }jr,|jjf|	7 }|jf|	7 }dd  fddjD D }r|d k	rt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r4|djjf|	 7 }jd  sL|r^|r^d| d S |S d S )NT)r   r  r  r  nested_join_translationr   r   r  Fr   r   )r   r   zSELECT r"  c             S   s   g | ]}|d k	r|qS )NrB   )rD   r  rB   rB   rF   r0     s   z,SQLCompiler.visit_select.<locals>.<listcomp>c          
      s&   g | ]\}}j | |d qS ))r   )r  )rD   r   r   )r   r  r  r6   ro   rB   rF   r0  "  s   c             S   s   g | ]\}}|qS rB   rB   )rD   r   r   rB   rB   rF   r0  5  s    c             S   s   g | ]\}}|qS rB   rB   )rD   r   r   rB   rB   rF   r0  7  s   c                s2   g | ]*\}}}}||t  fd d|D |fqS )c             3   s   | ]}  ||V  qd S )N)r  )rD   o)	translaterB   rF   r   >  s    z6SQLCompiler.visit_select.<locals>.<listcomp>.<genexpr>)r  )rD   r   r   rz   r   )r  rB   rF   r0  >  s   c                s$   g | ]\}}|d  j jfkr|qS )*)re   r   )rD   dialect_nameZht)ro   rB   rF   r0  H  s   r   r   )r  r   re   Zsupports_right_nested_joinsr  visit_selectr  r  r  _setup_select_stackcopyr  _hints_setup_select_hints	_prefixesr  get_select_precolumnsZ_columns_plus_namesr   r  r   _compose_select_bodyZ_statement_hintsr  r   rR  r  r   )ro   r6   r   r  r  r  r  Zselect_wraps_forr  r{   Zneeds_nested_translationr  r  r  r   r  	hint_textbyfromr  Zper_dialectrB   )r   r  r  r6   ro   r  rF   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  )re   r   ry   )rD   from_re   r  )ro   rB   rF   r0  a  s   
z3SQLCompiler._setup_select_hints.<locals>.<listcomp>)r   r  r  r  )ro   r6   r  r  rB   )ro   rF   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 )NrE  rF  rB   )r  r  )rF  rE  r   )r  r  r8   r   _from_objectsr=   r   rH  )ro   r6   r   r   r  rE  rF  r  Znew_correlate_fromsZall_correlate_fromsZ	new_entryrB   rB   rF   r  m  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  )ry   )rD   f)r  r{   ro   rB   rF   r0    s   z4SQLCompiler._compose_select_body.<locals>.<listcomp>c                s"   g | ]}|j fd di qS )r   T)ry   )rD   r  )r{   ro   rB   rF   r0    s   z 
WHERE z	 
HAVING )r*   r  r   _whereclausery   _group_by_clauser%  rM  Z_having_order_by_clauserN  rO  rP  rQ  Z_for_update_argfor_update_clause)ro   r  r6   r  r  r  r{   trB   )r  r{   ro   rF   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)re   r   ry   )rD   prefixr  )r   ro   rB   rF   r     s   z1SQLCompiler._generate_prefixes.<locals>.<genexpr>)r*   )ro   stmtprefixesr   r(  rB   )r   ro   rF   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 rB   )r   )rD   r  )ro   rB   rF   r0    s    z2SQLCompiler._render_cte_clause.<locals>.<listcomp>r"  z, 
c             S   s   g | ]}|qS rB   rB   )rD   ZtxtrB   rB   rF   r0    s    z
 )r   sumr   r   get_cte_preambler   r*   values)ro   Zcte_textrB   )ro   rF   rR    s    
zSQLCompiler._render_cte_clausec             C   s   |rdS dS d S )NzWITH RECURSIVEZWITHrB   )ro   r  rB   rB   rF   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)ro   r6   r   rB   rB   rF   r    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  ry   )ro   r6   r   Zgroup_byrB   rB   rF   rM    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  ry   )ro   r6   r   r1  rB   rB   rF   rN    s    zSQLCompiler.order_by_clausec             K   s   dS )Nz FOR UPDATErB   )ro   r6   r   rB   rB   rF   r    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   )ro   r  returning_colsrB   rB   rF   returning_clause  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 )rO  rm   rP  )ro   r6   r   r  rB   rB   rF   rQ    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|   )rg   r   r   r   r   r  )
ro   r:   r   r  r  r  
use_schemar{   r   r  rB   rB   rF   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isouterr+   ry   r5   r  )ro   r*   r   r{   Z	join_typerB   rB   rF   
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  )re   r   )rD   r:   re   r  )ro   rB   rF   r0  6	  s   
z1SQLCompiler._setup_crud_hints.<locals>.<listcomp>T)r   r  r  r:   r  )ro   r  
table_textdialect_hintsrB   )ro   rF   _setup_crud_hints3	  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 }nX|s|r|d7 }nB|jr|dddd |D  7 }n|dddd
 |D  7 }|j d k	r0| j|j f|}|r0|d| 7 }|rJ| jsJ|d| 7 }| jrn|rn| jjsn|  | }| j !d |rd| d S |S d S )N)rE  rF  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  )rD   r  )rg   rB   rF   r0  z	  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   NrB   )rD   r  rB   rB   rF   r   	  s    z5SQLCompiler.visit_insert.<locals>.<genexpr>.<genexpr>N)r*   )rD   Zcrud_param_setrB   rB   rF   r   	  s   z+SQLCompiler.visit_insert.<locals>.<genexpr>z VALUES (%s)c             S   s   g | ]}|d  qS )r   rB   )rD   r  rB   rB   rF   r0  	  s    r   r   r   )"r   rH  r8   r   _setup_crud_paramsZISINSERTre   supports_default_valuesZsupports_empty_insertr   r   r   Z_has_multi_parametersZsupports_multivalues_insertrg   r  r  format_tabler:   r  r  r*   r   r   r  returning_precedes_valuesr6   rm   Z_insert_from_selectr   Zcte_follows_insertrR  Z_post_values_clauser   )ro   Zinsert_stmtr   r   r  crud_paramsZcrud_params_singler  r  r  rT  r  Zselect_textZpost_values_clauserB   )rg   rF   visit_insertA	  s    



zSQLCompiler.visit_insertc             C   s   dS )z3Provide a hook for MySQL to add LIMIT to the UPDATENrB   )ro   update_stmtrB   rB   rF   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  )ry   )ro   r  
from_tableextra_fromsr   rB   rB   rF   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)rw   )ro   r  r  r  
from_hintsr   rB   rB   rF   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 rB   rB   )rD   r  )
main_fromsrB   rF   r0  	  s    z,SQLCompiler.visit_update.<locals>.<listcomp>)rE  rF  r   zUPDATE z SET z, c             3   s,   | ]$}|d  j  dd |d  V  qdS )r   )r   =r   N)ry   )rD   r  )r   ro   rB   rF   r   	  s   z+SQLCompiler.visit_update.<locals>.<genexpr>r"  z WHERE r   r   r   )r   _extra_fromsboolr8   r   r  r:   r=   rH  r  r  r  r   r  ZISUPDATEr  r  'render_table_with_column_in_update_fromr*   r   r   r  r  r  r  rm   r  r   rR  r   )ro   r  r   r   r  r  Zis_multitableZrender_extra_fromsrE  r  r  r   r  extra_from_textr  rQ  rB   )r   r	  ro   rF   visit_update	  sz    


zSQLCompiler.visit_updatec             C   s   t | | jS )N)r   _key_getters_for_crud_columnri   )ro   rB   rB   rF   r  0
  s    z(SQLCompiler._key_getters_for_crud_columnc             K   s   t ddS )zProvide 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)rw   )ro   r  r  r  r  r   rB   rB   rF   delete_extra_from_clause4
  s    z$SQLCompiler.delete_extra_from_clausec             C   s   |j | dddS )NT)r   r  )ry   )ro   delete_stmtr  r  rB   rB   rF   delete_table_clauseD
  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)rE  rF  r   zDELETE zFROM r"  z WHERE r   r   r   )r   r   r  ZISDELETEr  r:   r=   rH  r  r  r  r  r  r   r  r  r  r  ry   r   rR  r   )ro   r  r   r   r  r  rE  r  r  r  r  r  rB   rB   rF   visit_deleteG
  s\    
zSQLCompiler.visit_deletec             C   s   d| j | S )NzSAVEPOINT %s)rg   format_savepoint)ro   savepoint_stmtrB   rB   rF   visit_savepoint
  s    zSQLCompiler.visit_savepointc             C   s   d| j | S )NzROLLBACK TO SAVEPOINT %s)rg   r  )ro   r  rB   rB   rF   visit_rollback_to_savepoint
  s    z'SQLCompiler.visit_rollback_to_savepointc             C   s   d| j | S )NzRELEASE SAVEPOINT %s)rg   r  )ro   r  rB   rB   rF   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)NT)F)FTNr   FNF)FFFNT)F)F)F)F)r   r   r   r   EXTRACT_MAPr6  COMPOUND_KEYWORDSrI  r   r   r   r  r   r  r  r  rk  r  r   r   r   r   rq   r   r   r   Zmemoized_instancemethodr   
contextlibcontextmanagerr   r   memoized_propertyr   r   rx   r~   ru   dependenciesr   r   r   r   r   r   r   r   r   r   r   r  r  r   r  r  r  r  r!  r'  r)  r*  r+  r/  r2  r3  r5  r9  rA  rD  rB  r?  rS  rV  r[  r]  r^  rb  rd  rg  rh  ri  r`  ro  rp  rq  rr  rs  rl  rY  rZ  rv  r{  r}  r  r  r  r  ry  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   	frozensetr  r  r  r  r  r  r  rR  r  r  rM  rN  r  r  rQ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rB   rB   rB   rF   r     sH  G8	"   +% 2			  8   v   
 L]       6
		    m
fJr   c               @   sP   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S )StrSQLCompilerz"a compiler subclass with a few non-standard SQL features allowed.

    Used for stringification of SQL statements when a real dialect is not
    available.

    c             C   s   dS )Nz<name unknown>rB   )ro   r   rB   rB   rF   r   
  s    z$StrSQLCompiler._fallback_column_namec             K   s$   d| j |jf|| j |jf|f S )Nz%s[%s])rm   r+   r5   )ro   r   r$  r   rB   rB   rF   visit_getitem_binary
  s    z#StrSQLCompiler.visit_getitem_binaryc             K   s   | j ||f|S )N)r"  )ro   r   r$  r   rB   rB   rF   visit_json_getitem_op_binary
  s    z+StrSQLCompiler.visit_json_getitem_op_binaryc             K   s   | j ||f|S )N)r"  )ro   r   r$  r   rB   rB   rF   !visit_json_path_getitem_op_binary
  s    z0StrSQLCompiler.visit_json_path_getitem_op_binaryc             K   s   d| j | S )Nz<next sequence value: %s>)rg   format_sequence)ro   seqr   rB   rB   rF   rB  
  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  )rD   r  )ro   rB   rF   r0  
  s   z3StrSQLCompiler.returning_clause.<locals>.<listcomp>z
RETURNING z, )r   Z_select_iterablesr*   )ro   r  r  columnsrB   )ro   rF   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)ry   )rD   r  )r  r   ro   rB   rF   r   
  s   z4StrSQLCompiler.update_from_clause.<locals>.<genexpr>)r*   )ro   r  r  r  r  r   rB   )r  r   ro   rF   r  
  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)ry   )rD   r  )r  r   ro   rB   rF   r   
  s   z:StrSQLCompiler.delete_extra_from_clause.<locals>.<genexpr>)r*   )ro   r  r  r  r  r   rB   )r  r   ro   rF   r  
  s    z'StrSQLCompiler.delete_extra_from_clauseN)r   r   r   r   r   r"  r#  r$  rB  r  r  r  rB   rB   rB   rF   r!  
  s   r!  c               @   sB  e Zd Zejdd Zejdd ZdLddZdd	 Zd
d Z	dd Z
dd ZdMddZdNddZdd Zdd Zdd ZdOddZdd ZdPd d!Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dS )QDDLCompilerc             C   s   | j | j d S )N)re   Zstatement_compiler)ro   rB   rB   rF   rx   
  s    zDDLCompiler.sql_compilerc             C   s   | j jS )N)re   r  )ro   rB   rB   rF   r  
  s    zDDLCompiler.type_compilerNc             C   s   d S )NrB   )ro   ru   rB   rB   rF   r~   
  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   r:   r   fullname)contextr   targetr   ZTabler  rg   format_table_seqr   
setdefaultr  rx   r  ri   )ro   Zddlr{   r*  rg   pathr:   ZschrB   rB   rF   	visit_ddl
  s    zDDLCompiler.visit_ddlc             C   s   | j |j}d| S )NzCREATE SCHEMA )rg   format_schemar   )ro   r   r   rB   rB   rF   visit_create_schema
  s    zDDLCompiler.visit_create_schemac             C   s(   | j |j}d| }|jr$|d7 }|S )NzDROP SCHEMA z CASCADE)rg   r0  r   cascade)ro   dropr   r  rB   rB   rF   visit_drop_schema
  s
    zDDLCompiler.visit_drop_schemac             C   sR  |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rd
}W qr t	j
k
r } z.tt	
td|j|	j|jd f  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   ) _include_foreign_key_constraintsz
)%s

)r   rg   r  r*   r  create_table_suffixr'  rm   primary_keyr   r   r   Zraise_from_causeuZdescriptionr   argscreate_table_constraintsZinclude_foreign_key_constraintspost_create_table)ro   r   r:   rg   r  r9  Z	separatorr6  Zcreate_columnr   Z	processedZceconstrB   rB   rF   visit_create_table
  sF    
0
zDDLCompiler.visit_create_tableFc                sL   |j }|jrd S  j||d}d fdd|jD }|rH|d| 7 }|S )N)r6  r"  c             3   s   | ]}  |V  qd S )N)rm   )rD   r   )ro   rB   rF   r   5  s    z2DDLCompiler.visit_create_column.<locals>.<genexpr>)r   systemget_column_specificationr*   constraints)ro   r   r6  r   r  r?  rB   )ro   rF   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 rB   )r:  )rD   r  )	omit_fkcsr:   rB   rF   r0  N  s   z8DDLCompiler.create_table_constraints.<locals>.<listcomp>z, 
	c             s   s   | ]}|d k	r|V  qd S )NrB   )rD   prB   rB   rF   r   U  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_rulere   Zsupports_alterr   rm   )rD   r   )ro   rB   rF   r   W  s
   

)r:  rH  Zforeign_key_constraintsr  r8   extendZ_sorted_constraintsr*   )ro   r:   r8  rC  Zall_fkcsrB   )rE  ro   r:   rF   r=  <  s    
z$DDLCompiler.create_table_constraintsc             C   s   d| j |j S )Nz
DROP TABLE )rg   r  r   )ro   r3  rB   rB   rF   visit_drop_tablee  s    zDDLCompiler.visit_drop_tablec             C   s   d| j |j S )Nz
DROP VIEW )rg   r  r   )ro   r3  rB   rB   rF   visit_drop_viewh  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.)r:   r   r   r   )ro   r   rB   rB   rF   _verify_index_tablek  s    
zDDLCompiler._verify_index_tableTc          	      sj   |j } |  j}d}|jr(|d7 }|d j||d|j|j|dd fdd|jD f 7 }|S )	NzCREATE zUNIQUE zINDEX %s ON %s (%s))include_schema)r  z, c             3   s    | ]} j j|d ddV  qdS )FT)r   rj  N)rx   rm   )rD   r  )ro   rB   rF   r     s   z1DDLCompiler.visit_create_index.<locals>.<genexpr>)	r   rJ  rg   r>   _prepared_index_namer  r:   r*   Zexpressions)ro   r   rK  Zinclude_table_schemar   rg   r  rB   )ro   rF   visit_create_indexq  s    


zDDLCompiler.visit_create_indexc             C   s   |j }d| j|dd S )Nz
DROP INDEX T)rK  )r   rL  )ro   r3  r   rB   rB   rF   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   )r:   rg   r   r   format_index)ro   r   rK  r   Zschema_nameZ
index_namerB   rB   rF   rL    s    
z DDLCompiler._prepared_index_namec             C   s    d| j |jj| |jf S )NzALTER TABLE %s ADD %s)rg   r  r   r:   rm   )ro   r   rB   rB   rF   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)rg   r  r   rx   r  commentr	   String)ro   r   rB   rB   rF   visit_set_table_comment  s    z#DDLCompiler.visit_set_table_commentc             C   s   d| j |j S )NzCOMMENT ON TABLE %s IS NULL)rg   r  r   )ro   r3  rB   rB   rF   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  )rg   r  r   rx   r  rQ  r	   rR  )ro   r   rB   rB   rF   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)rU  )rg   r  r   )ro   r3  rB   rB   rF   visit_drop_column_comment  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)rg   r%  r   Z	incrementstartZminvalueZmaxvalueZ
nominvalueZ
nomaxvaluecacher4   cycle)ro   r   r  rB   rB   rF   visit_create_sequence  s*    
z!DDLCompiler.visit_create_sequencec             C   s   d| j |j S )NzDROP SEQUENCE %s)rg   r%  r   )ro   r3  rB   rB   rF   visit_drop_sequence  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   rg   format_constraintr   r   r  r:   r2  )ro   r3  r   formatted_namerB   rB   rF   visit_drop_constraint  s    

z!DDLCompiler.visit_drop_constraintc             K   sT   | j |d | jjj|j|d }| |}|d k	rB|d| 7 }|jsP|d7 }|S )Nr"  )r   z	 DEFAULT z	 NOT NULL)rg   r  re   r  rm   r   get_column_default_stringZnullable)ro   r   r{   Zcolspecr   rB   rB   rF   rB    s    
z$DDLCompiler.get_column_specificationc             C   s   dS )Nr|   rB   )ro   r:   rB   rB   rF   r9    s    zDDLCompiler.create_table_suffixc             C   s   dS )Nr|   rB   )ro   r:   rB   rB   rF   r>     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)rj  )r   Zserver_defaultr   ZDefaultClauseargr   Zstring_typesrx   r  r	   ru  rm   )ro   r   rB   rB   rF   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   rj  )r   rg   r]  rx   rm   r  define_constraint_deferrability)ro   r   r  r^  rB   rB   rF   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   rj  )r   rg   r]  rx   rm   r  rb  )ro   r   r  r^  rB   rB   rF   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)rg   r   r   )rD   r  )ro   rB   rF   r   2  s   z;DDLCompiler.visit_primary_key_constraint.<locals>.<genexpr>)	r   r   rg   r]  r*   Z_implicit_generatedZcolumns_autoinc_firstr'  rb  )ro   r   r  r^  rB   )ro   rF   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   )rD   r  )rg   rB   rF   r   F  s    z;DDLCompiler.visit_foreign_key_constraint.<locals>.<genexpr>c             3   s   | ]}  |jjV  qd S )N)r   r   r   )rD   r  )rg   rB   rF   r   L  s    )rg   r   r]  r   r   r   r:   r*   define_constraint_remote_tabledefine_constraint_matchdefine_constraint_cascadesrb  )ro   r   r  r^  Zremote_tablerB   )rg   rF   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  )ro   r   r:   rg   rB   rB   rF   rg  T  s    z*DDLCompiler.define_constraint_remote_tablec                sh   t |dkrdS d}|jd k	r6 j|}|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)rg   r   r   )rD   r  )ro   rB   rF   r   a  s    z6DDLCompiler.visit_unique_constraint.<locals>.<genexpr>)r   r   rg   r]  r*   rb  )ro   r   r  r^  rB   )ro   rF   visit_unique_constraintY  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ondeleterg   validate_sql_phraseFK_ON_DELETEZonupdateFK_ON_UPDATE)ro   r   r  rB   rB   rF   ri  f  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'   rg   rl  FK_INITIALLY)ro   r   r  rB   rB   rF   rb  r  s    



z+DDLCompiler.define_constraint_deferrabilityc             C   s    d}|j d k	r|d|j  7 }|S )Nr|   z	 MATCH %s)match)ro   r   r  rB   rB   rF   rh    s    
z#DDLCompiler.define_constraint_match)N)F)N)FT)F))r   r   r   r   r  rx   r  r~   r/  r1  r4  r@  rD  r=  rH  rI  rJ  rM  rN  rL  rP  rS  rT  rV  rW  r[  r\  r_  rB  r9  r>  r`  rc  rd  re  rj  rg  rk  ri  rb  rh  rB   rB   rB   rF   r(  
  sH   
1

(


r(  c               @   s\  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUS )VGenericTypeCompilerc             K   s   dS )NZFLOATrB   )ro   r   r   rB   rB   rF   visit_FLOAT  s    zGenericTypeCompiler.visit_FLOATc             K   s   dS )NZREALrB   )ro   r   r   rB   rB   rF   
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))rt  scale)rt  ru  )ro   r   r   rB   rB   rF   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)rt  z!DECIMAL(%(precision)s, %(scale)s))rt  ru  )rt  ru  )ro   r   r   rB   rB   rF   visit_DECIMAL  s    

z!GenericTypeCompiler.visit_DECIMALc             K   s   dS )NZINTEGERrB   )ro   r   r   rB   rB   rF   visit_INTEGER  s    z!GenericTypeCompiler.visit_INTEGERc             K   s   dS )NZSMALLINTrB   )ro   r   r   rB   rB   rF   visit_SMALLINT  s    z"GenericTypeCompiler.visit_SMALLINTc             K   s   dS )NZBIGINTrB   )ro   r   r   rB   rB   rF   visit_BIGINT  s    z GenericTypeCompiler.visit_BIGINTc             K   s   dS )N	TIMESTAMPrB   )ro   r   r   rB   rB   rF   visit_TIMESTAMP  s    z#GenericTypeCompiler.visit_TIMESTAMPc             K   s   dS )NZDATETIMErB   )ro   r   r   rB   rB   rF   visit_DATETIME  s    z"GenericTypeCompiler.visit_DATETIMEc             K   s   dS )NZDATErB   )ro   r   r   rB   rB   rF   
visit_DATE  s    zGenericTypeCompiler.visit_DATEc             K   s   dS )NZTIMErB   )ro   r   r   rB   rB   rF   
visit_TIME  s    zGenericTypeCompiler.visit_TIMEc             K   s   dS )NZCLOBrB   )ro   r   r   rB   rB   rF   
visit_CLOB  s    zGenericTypeCompiler.visit_CLOBc             K   s   dS )NZNCLOBrB   )ro   r   r   rB   rB   rF   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   )ro   r   r   r  rB   rB   rF   _render_string_type  s    z'GenericTypeCompiler._render_string_typec             K   s   |  |dS )NZCHAR)r  )ro   r   r   rB   rB   rF   
visit_CHAR  s    zGenericTypeCompiler.visit_CHARc             K   s   |  |dS )NZNCHAR)r  )ro   r   r   rB   rB   rF   visit_NCHAR  s    zGenericTypeCompiler.visit_NCHARc             K   s   |  |dS )NZVARCHAR)r  )ro   r   r   rB   rB   rF   visit_VARCHAR  s    z!GenericTypeCompiler.visit_VARCHARc             K   s   |  |dS )NZNVARCHAR)r  )ro   r   r   rB   rB   rF   visit_NVARCHAR  s    z"GenericTypeCompiler.visit_NVARCHARc             K   s   |  |dS )NZTEXT)r  )ro   r   r   rB   rB   rF   
visit_TEXT  s    zGenericTypeCompiler.visit_TEXTc             K   s   dS )NZBLOBrB   )ro   r   r   rB   rB   rF   
visit_BLOB  s    zGenericTypeCompiler.visit_BLOBc             K   s   d|j rd|j  pd S )NZBINARYz(%d)r|   )r  )ro   r   r   rB   rB   rF   visit_BINARY  s    z GenericTypeCompiler.visit_BINARYc             K   s   d|j rd|j  pd S )NZ	VARBINARYz(%d)r|   )r  )ro   r   r   rB   rB   rF   visit_VARBINARY  s    z#GenericTypeCompiler.visit_VARBINARYc             K   s   dS )NZBOOLEANrB   )ro   r   r   rB   rB   rF   visit_BOOLEAN  s    z!GenericTypeCompiler.visit_BOOLEANc             K   s   | j |f|S )N)r  )ro   r   r   rB   rB   rF   visit_large_binary  s    z&GenericTypeCompiler.visit_large_binaryc             K   s   | j |f|S )N)r  )ro   r   r   rB   rB   rF   visit_boolean  s    z!GenericTypeCompiler.visit_booleanc             K   s   | j |f|S )N)r  )ro   r   r   rB   rB   rF   
visit_time  s    zGenericTypeCompiler.visit_timec             K   s   | j |f|S )N)r}  )ro   r   r   rB   rB   rF   visit_datetime  s    z"GenericTypeCompiler.visit_datetimec             K   s   | j |f|S )N)r~  )ro   r   r   rB   rB   rF   
visit_date  s    zGenericTypeCompiler.visit_datec             K   s   | j |f|S )N)rz  )ro   r   r   rB   rB   rF   visit_big_integer  s    z%GenericTypeCompiler.visit_big_integerc             K   s   | j |f|S )N)ry  )ro   r   r   rB   rB   rF   visit_small_integer  s    z'GenericTypeCompiler.visit_small_integerc             K   s   | j |f|S )N)rx  )ro   r   r   rB   rB   rF   visit_integer  s    z!GenericTypeCompiler.visit_integerc             K   s   | j |f|S )N)rs  )ro   r   r   rB   rB   rF   
visit_real  s    zGenericTypeCompiler.visit_realc             K   s   | j |f|S )N)rr  )ro   r   r   rB   rB   rF   visit_float  s    zGenericTypeCompiler.visit_floatc             K   s   | j |f|S )N)rv  )ro   r   r   rB   rB   rF   visit_numeric   s    z!GenericTypeCompiler.visit_numericc             K   s   | j |f|S )N)r  )ro   r   r   rB   rB   rF   visit_string  s    z GenericTypeCompiler.visit_stringc             K   s   | j |f|S )N)r  )ro   r   r   rB   rB   rF   visit_unicode  s    z!GenericTypeCompiler.visit_unicodec             K   s   | j |f|S )N)r  )ro   r   r   rB   rB   rF   
visit_text	  s    zGenericTypeCompiler.visit_textc             K   s   | j |f|S )N)r  )ro   r   r   rB   rB   rF   visit_unicode_text  s    z&GenericTypeCompiler.visit_unicode_textc             K   s   | j |f|S )N)r  )ro   r   r   rB   rB   rF   
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   )ro   r   r   rB   rB   rF   r    s    zGenericTypeCompiler.visit_nullc             K   s   | j || jf|S )N)rm   Ztype_enginere   )ro   r   r   rB   rB   rF   visit_type_decorator  s    z(GenericTypeCompiler.visit_type_decoratorc             K   s   |j f |S )N)Zget_col_spec)ro   r   r   rB   rB   rF   visit_user_defined  s    z&GenericTypeCompiler.visit_user_definedN)-r   r   r   rr  rs  rv  rw  rx  ry  rz  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  rB   rB   rB   rF   rq    sT   	rq  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)ro   r   rB   rB   rF   __getattr__!  s    
zStrSQLTypeCompiler.__getattr__c             K   s   d|j j S )Nz%s)r>  r   )ro   r   r   rB   rB   rF   r  '  s    z!StrSQLTypeCompiler._visit_unknownN)r   r   r   r  r  rB   rB   rB   rF   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   )rL   rK   N)
re   initial_quotefinal_quoteescape_quoteescape_to_quoteomit_schemaquote_case_sensitive_collations_stringsr   r  )ro   re   r  r  r  r  r  rB   rB   rF   rq   7  s    zIdentifierPreparer.__init__c             C   s,   | j | j }|j| j t||_|S )N)r>  __new____dict__r  r   _schema_getterr   )ro   rp   ZpreprB   rB   rF   rh   [  s    z)IdentifierPreparer._with_schema_translatec             C   s&   | | j| j}| jr"| dd}|S )zEscape an identifier.

        Subclasses should override this to provide database-dependent
        escaping behavior.
        r  z%%)r  r  r  r  )ro   r   rB   rB   rF   _escape_identifiera  s    z%IdentifierPreparer._escape_identifierc             C   s   | | j| jS )zCanonicalize an escaped identifier.

        Subclasses should override this to provide database-dependent
        unescaping behavior that reverses _escape_identifier.
        )r  r  r  )ro   r   rB   rB   rF   _unescape_identifierm  s    z'IdentifierPreparer._unescape_identifierc             C   s*   |dk	r&| |s&td||jf |S )zkeyword sequence filter.

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

        .. versionadded:: 1.3

        Nz/Unexpected SQL phrase: %r (matching against %r))rp  r   r   pattern)ro   r   ZregrB   rB   rF   rl  v  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  )ro   r   rB   rB   rF   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_charactersrp  r   	text_type)ro   r   Zlc_valuerB   rB   rF   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  rp  r   r  )ro   r   rB   rB   rF   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`.

        NzThe 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   )ro   r   forcerB   rB   rF   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`.

        NzThe 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  )ro   r  r  rB   rB   rF   r     s    




zIdentifierPreparer.quotec             C   s   | j r| |S |S d S )N)r  r   )ro   Zcollation_namerB   rB   rF   r     s    
z#IdentifierPreparer.format_collationc             C   s>   |  |j}| |}| js:|r:|d k	r:| |d | }|S )Nr   )r   r   r   r  r   )ro   rC  r  r   r   rB   rB   rF   r%    s    
z"IdentifierPreparer.format_sequencec             C   s   |  |p|jS )N)r   r   )ro   r   r   rB   rB   rF   r     s    zIdentifierPreparer.format_labelc             C   s   |  |p|jS )N)r   r   )ro   r   r   rB   rB   rF   r    s    zIdentifierPreparer.format_aliasc             C   s"   |p|j }| |r| |}|S )N)r  r  r  )ro   Z	savepointr   r  rB   rB   rF   r    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}t||kr|d|d  d t|dd   }n| j	| | |S )Nr   r      rT  )r   r   r   Z_defer_nameZ_constraint_name_for_tabler:   Z_defer_none_namer   r   re   Zmax_index_name_lengthr   r   r   Zmd5_hexZvalidate_identifierr   )ro   Znamingr   r   Zmax_rB   rB   rF   r]    s"    


(z$IdentifierPreparer.format_constraintc             C   s
   |  |S )N)r]  )ro   r   rB   rB   rF   rO  ;  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   )ro   r:   r  r   r   r   rB   rB   rF   r  >  s    

zIdentifierPreparer.format_tablec             C   s
   |  |S )zPrepare a quoted schema name.)r   )ro   r   rB   rB   rF   r0  K  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  r:   r   )ro   r   rU  r   Z
table_namer  rB   rB   rF   r  P  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  )ro   r:   r  r   rB   rB   rF   r,  v  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 rB   )r   r  )rD   r#  rB   rB   rF   r0    s   z5IdentifierPreparer._r_identifiers.<locals>.<listcomp>zM(?:(?:%(initial)s((?:%(escaped)s|[^%(final)s])+)%(final)s|([^\.]+))(?=\.|$))+)initialfinalZescaped)r  r  r  r   rr   )ro   r  r  Zescaped_finalrrB   rB   rF   _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 rB   )r  )rD   rG  )ro   rB   rF   r0    s   z;IdentifierPreparer.unformat_identifiers.<locals>.<listcomp>c             S   s   g | ]\}}|p|qS rB   rB   )rD   abrB   rB   rF   r0    s    )r  findall)ro   Zidentifiersr  rB   )ro   rF   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   rq   rh   r  r  rl  r  r  r:  r   r   r   r%  r   r  r  r   r  r]  rO  r  r0  r  r,  r  r  r  rB   rB   rB   rF   r  +  sF   
    
	

%
2



	
   
 
r  )jr   r  r   r   r|   r   r   r   r   r   r   r	   r
   r   r   r8   r  rr   Ir  ZLEGAL_CHARACTERS_PLUS_SPACEranger=   r  rm  rn  ro  UNICODEr  r  r   and_or_addmulr   ZdivmodtruedivnegltlenegtgeeqZis_distinct_fromZisnot_distinct_fromZ	concat_opra  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   rO   r   r   r   r   r-   r.   rP   rQ   r7   r?   ZcubeZrollupZgrouping_setsr=  r  r  ra   Z	UNION_ALLrb   Z
EXCEPT_ALLrc   ZINTERSECT_ALLr  objectrd   Zwith_metaclassZEnsureKWArgTyper   Z	Visitabler   r   r!  r(  rq  r  r  rB   rB   rB   rF   <module>   s  



                   3   7 