U
    [h                 _   @   s  d Z ddlZddl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 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/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpg^ZedqejZedrejZdsdt edduD dvgZedwejZedwejZ edxejZ!edyej"Z#edzej"Z$d{d|d}d~ddZ%edZ&e'e(ddZ)e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jCdejDdejEdejFdejGdejHdejIdejJdejKdejLdejMdejNdi%ZOejPdejQdejRdejSdejTdejUdejVdejWdejXdejYdejZdej[dej\dej]diZ^ddddddddddddddddŜZ_ej`jadej`jbdej`jcdej`jddej`jedej`jfdiZgdZhdZidZjdZkelddddddgZmejnddddՍZoejnddddՍZpejnddddՍZqejnddepeqB dՍZrG dd݄ deldddgZsG dd detZuG dd devejwetZxG dd de
jyZzG dd deuZ{G dd de{Z|G dd deuZ}G dd dexZ~G dd de~ZG dd detZd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   )base)	coercions)crud)elements)	functions)	operators)schema)
selectable)sqltypes)util)NO_ARG)prefix_anon_map)quoted_name   )exc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xrT   rT   ;/tmp/pip-unpacked-wheel-joqu7d3y/sqlalchemy/sql/compiler.py	<setcomp>   s     rY   
   $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[%\(\):\[\] ]z%():[] ZPAZC___z AND z OR z + z * z - z /  % -z < z <= z != z > z >= z = z IS DISTINCT FROM z IS NOT DISTINCT FROM z || z MATCH z NOT MATCH z IN z NOT IN , z FROM  AS z IS z IS NOT z	 COLLATE zEXISTS 	DISTINCT zNOT zANY zALL z DESCz ASCz NULLS FIRSTz NULLS 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)rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   UNIONz	UNION ALLEXCEPTz
EXCEPT ALL	INTERSECTzINTERSECT ALL   ExpandedState	statementZadditional_parameters
processorspositiontupparameter_expansion
NO_LINTINGzDisable all linting.)	canonicalCOLLECT_CARTESIAN_PRODUCTSzOCollect data on FROMs and cartesian products and gather into 'self.from_linter'WARN_LINTINGz,Emit warnings for linters that find problemsFROM_LINTINGzQWarn for cartesian products; combines COLLECT_CARTESIAN_PRODUCTS and WARN_LINTINGc                   @   s   e Zd ZdddZdd ZdS )
FromLinterNc                    s   | j }|sdS t| j}t|}|d k	r8|}|| n| }t|g}|r|r|  |   fdd|D }|	 fdd|D  |
| qL|r||fS dS d S )N)NNc                    s   h | ]} |kr|qS rT   rT   rV   ZedgenoderT   rX   rY   D  s      z"FromLinter.lint.<locals>.<setcomp>c                 3   s   | ]}||    V  qd S N)indexr   r   rT   rX   	<genexpr>H  s     z"FromLinter.lint.<locals>.<genexpr>)fromsrI   edgesremovepopcollectionsdequepopleftdiscard
extendleftdifference_update)selfstartr   r   the_rest
start_withstackZ	to_removerT   r   rX   lint,  s&    

zFromLinter.lintc                    sV      \}}|rR|}|rRd}d fdd|D }|j| j| d}t| d S )NzSELECT statement has a cartesian product between FROM element(s) {froms} and FROM element "{start}".  Apply join condition(s) between each element to resolve.rc   c                 3   s    | ]}d j  j| dV  qdS )z"{elem}")elemN)r^   r   )rV   from_r   rT   rX   r   _  s   z"FromLinter.warn.<locals>.<genexpr>)r   r   )r   r3   r^   r   r   warn)r   r   r   r   templateZ	froms_strmessagerT   r   rX   r   Q  s     zFromLinter.warn)N)__name__
__module____qualname__r   r   rT   rT   rT   rX   r   +  s   
%r   r   r   c                   @   s   e Zd ZdZdZdZdZejZ	ejZ
dZdZdZdZdde fddZ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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.
    NFc                 C   s   || _ | j j| _|r(|| _| j|| _|dk	r||| _|j| _|j| _| jrT|j	| _
| j| jf|| _|r|| j| j|| _t | _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 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identifier_preparerpreparerschema_translate_map_with_schema_translater~   Zsupports_executioncan_execute_annotations_execution_optionsexecution_optionsprocessstring_render_schema_translatesr   perf_counter	_gen_time)r   r   r~   r   Zrender_schema_translatecompile_kwargsrT   rT   rX   __init__  s(    
 zCompiled.__init__c                 C   s&   | j r|| |||S t| jd S r   )r   Z_execute_compiledr   ZObjectNotExecutableErrorr~   )r   
connectionZmultiparamsparamsr   rT   rT   rX   _execute_on_connection  s       zCompiled._execute_on_connectionc                 C   s   t jt| t||d d S NZreplace_context)r   raise_r   UnsupportedCompilationErrortype)r   elementerrrT   rT   rX   visit_unsupported_compilation  s    z&Compiled.visit_unsupported_compilationc                 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NotImplementedErrorr   rT   rT   rX   sql_compiler  s    zCompiled.sql_compilerc                 K   s   |j | f|S r   _compiler_dispatch)r   objkwargsrT   rT   rX   r     s    zCompiled.processc                 C   s
   | j pdS )z3Return the string text of the generated SQL or DDL. )r   r   rT   rT   rX   __str__  s    zCompiled.__str__Tc                 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.
        Nr   r   r   extracted_parametersescape_namesrT   rT   rX   construct_params  s    
zCompiled.construct_paramsc                 C   s   |   S )z0Return the bind params for this compiled object.r   r   rT   rT   rX   r     s    zCompiled.params)NNT)r   r   r   __doc__Z_cached_metadata_result_columnsr   r   
EMPTY_DICTr   r   compile_statedml_compile_state	cache_keyr   immutabledictr   r   r   propertyr   r   r   r   r   rT   rT   rT   rX   r   j  s4   
3

	     
r   c                   @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
TypeCompilerz2Produces DDL specification for TypeEngine objects.z	visit_\w+c                 C   s
   || _ d S r   )r   )r   r   rT   rT   rX   r     s    zTypeCompiler.__init__c                 K   s   |j | f|S r   r   r   type_kwrT   rT   rX   r     s    zTypeCompiler.processc                 K   s   t jt| ||d d S r   )r   r   r   r   )r   r   r   r   rT   rT   rX   r     s    
z*TypeCompiler.visit_unsupported_compilationN)r   r   r   r   Zensure_kwargr   r   r   rT   rT   rT   rX   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)r   namerT   c                 C   s   || _ || _|f| | _d S r   )r   r   
_alt_names)r   colr   	alt_namesrT   rT   rX   r   '  s    z_CompileLabel.__init__c                 C   s   | j jS r   )r   	proxy_setr   rT   rT   rX   r   ,  s    z_CompileLabel.proxy_setc                 C   s   | j jS r   )r   r   r   rT   rT   rX   r   0  s    z_CompileLabel.typec                 K   s   | S r   rT   )r   r   rT   rT   rX   
self_group4  s    z_CompileLabel.self_groupN)rT   )r   r   r   r   __visit_name__	__slots__r   r   r   r   r   rT   rT   rT   rX   r      s   


r   c                   @   sx  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dZe Ze ZejZdZd ZZdZ dZ!e"#dZ$dZ%dZ&dZ'ddde(fddZ)e*d	d
 Z+e*dd Z,ej-dd Z.ej/dd Z0e1j2dd Z3dd Z4ej-dd Z5dd Z6e*dd Z7d-ddZ8ej/d.ddZ9e*dd  Z:d/d!d"Z;e<d#d$d% Z=ej-d&d' Z>ej-e<d(d)d* Z?ej-e<d(d+d, Z@d-d. ZAd0d/d0ZBd1d2 ZCd1d3d4ZDd2d5d6ZEd3d7d8ZFd9d: ZGd;d< ZHd4d=d>ZId?d@ ZJdAdB ZKdCdD ZLdEdF ZMdGdH ZNdIdJ ZOd5dKdLZPd6dMdNZQdOdP ZRdQdR ZSdSdT ZTdUdV ZUdWdX ZVdYdZ ZWd[d\ ZXd]d^ ZYd_d` ZZdadb Z[dcdd Z\dedf Z]dgdh Z^didj Z_dkdl Z`dmdn Zad7dodpZbdqdr Zcdsdt Zddudv Zed8dwdxZfdydz Zgd{d| Zhd9d}d~Zidd Zjdd Zkdd Zldd Zmdd Zndd Zod:ddZpdd Zqd;ddZrdd Zsdd Ztdd Zudd Zvdd Zwd<ddZxdd Zydd Zzej-dd Z{dd Z|dd Z}dd Z~dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd=ddZedfddĄZddƄ ZddȄ Zddʄ Zdd̄ Zd>dd΄Zd?ddЄZdd҄ ZddԄ Zd@ddքZdd؄ Zddڄ ZdAdd܄ZdBddބZdd Zdd ZdCddZdDddZdd Zdd Zdd Zdd Zdd Zede fde fgZdEddZdZdFddZdd Zdd Zdd Zdd ZdGd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dHddZdI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, ZdS (J  SQLCompilerz~Default implementation of :class:`.Compiled`.

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

    FNTrT   z"__\[POSTCOMPILE_(\S+?)(~~.+?~~)?\]c           	      K   sf  || _ || _|r@dd |d D  | _}|dd |d D  || _|| _i | _t | _	g | _
g | _|j| _| jri | _g | _|jdk| _t|j | _d| _|jp|j| _t | _i | _tj| ||f| | js| js| jr6|jr|j| _| js| jr6|j rd| _!n(| jr6| jr0| j"j#r6|j$r6d| _!| jrN| jrN| %  | j&rb| j'dd 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 for_executemany: whether INSERT / UPDATE statements should
         expect that they are to be invoked in an "executemany" style,
         which may impact how the statement will be expected to return the
         values of defaults and autoincrement / sequences and similar.
         Depending on the backend and driver in use, support for retrieving
         these values may be disabled which means SQL expressions may
         be rendered inline, RETURNING may not be rendered, etc.

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

        c                 S   s   i | ]}|j |qS rT   keyrV   brT   rT   rX   
<dictcomp>  s     z(SQLCompiler.__init__.<locals>.<dictcomp>r   c                 S   s   i | ]}||gqS rT   rT   r   rT   rT   rX   r     s      r_   NT)_populate_self)(column_keysr   _cache_key_bind_matchupdatefor_executemanylintingbindsr   Zcolumn_dict
bind_namesr   r   
positionalpositiontup_levelr   
paramstyle_numeric_bindsBIND_TEMPLATESbindtemplatecteslabel_lengthmax_identifier_lengthr   anon_maptruncated_namesr   r   isinsertisupdateisdelete
_returning	returningZ_inlineinliner   Zinsert_executemany_returningZ_return_defaults_apply_numbered_params_render_postcompile#_process_parameters_for_postcompile)	r   r   r~   r   r   r   r   r   ckbmrT   rT   rX   r     sV    

zSQLCompiler.__init__c              
   C   sJ   z| j d d W S  tk
rD } ztjtd|d W 5 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 entryr   N)r   
IndexErrorr   r   )r   ZierT   rT   rX   current_executableA  s    zSQLCompiler.current_executablec                 C   s   t | j| j S r   )listinsert_prefetchupdate_prefetchr   rT   rT   rX   prefetchg  s    zSQLCompiler.prefetchc                 C   s   i S r   rT   r   rT   rT   rX   _global_attributesk  s    zSQLCompiler._global_attributesc                 C   s>   t  | _i | _i | _d| _| jr:i | _i | _t	
t| _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_level_namelevel_name_by_ctectes_recursiver   cte_positional	cte_levelr   defaultdictr  	cte_orderr   rT   rT   rX   _init_cte_stateo  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 5 |r\|d || | _ | _X dS )z;special API to support the use case of 'nested result sets'Fneed_result_map_for_nestedr
  TN)r   _ordered_columnsr   r   )r   Zresult_columnsZordered_columnsentryrT   rT   rX   _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 r   )rU   r   nextmZposcountrT   rX   <lambda>      z4SQLCompiler._apply_numbered_params.<locals>.<lambda>)	itertoolscountresubr   r   rT   r"  rX   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 r   rT   rV   r   valuerT   rT   rX   r     s
   z/SQLCompiler._bind_processors.<locals>.<genexpr>c                 3   sH   | ]@} j | |jjs$|j jnt fd d|jjD fV  qdS )c                 3   s   | ]}|  jV  qd S r   )_cached_bind_processorr   )rV   Z	elem_typer   rT   rX   r     s   z9SQLCompiler._bind_processors.<locals>.<genexpr>.<genexpr>N)r   r   _is_tuple_typer+  r   tupletypes)rV   	bindparamr   rT   rX   r     s   
)dictr   r   rT   r   rX   _bind_processors  s
    

zSQLCompiler._bind_processorsc                 C   s   t | jdkS Nr   )lenr   r   rT   rT   rX   is_subquery  s    zSQLCompiler.is_subqueryc                 C   s   | S r   rT   r   rT   rT   rX   r     s    zSQLCompiler.sql_compilerc              
      s  |ot | j}|rxz| jd }W n6 tk
rV } ztjtd|d W 5 d}~X Y nX | j  fddt	||D }	nd}	|r^i }
| j
 D ]\}}|r| j||n|}|j|kr||j |
|< q||kr|| |
|< q|r"|jr"|rtjd|j|f dd	ntjd
|j dd	q|	r6|	||}n|}|jrN|j|
|< q|j|
|< q|
S i }
| j
 D ]\}}|r| j||n|}|r|jr|rtjd|j|f dd	ntjd
|j dd	|	r|	||}n|}|jr|j|
|< n
|j|
|< ql|
S dS )z5return a dictionary of bind parameter keys and valuesr   zcThis compiled object has no original cache key; can't pass extracted_parameters to construct_paramsr   Nc                    s$   i | ]\}} | D ]
}||qqS rT   rT   )rV   r   Z	extractedbindr	  rT   rX   r     s
   
  z0SQLCompiler.construct_params.<locals>.<dictcomp>z@A value is required for bind parameter %r, in parameter group %dZcd3x)codez)A value is required for bind parameter %r)boolescaped_bind_namesr   	TypeErrorr   r   r   CompileErrorr   zipr   itemsgetr   requiredZInvalidRequestErrorcallableeffective_valuer*  )r   r   Z_group_number_checkr   r   Zhas_escaped_namesZorig_extractedr   Zresolved_extractedpdr/  r   escaped_nameZvalue_paramrT   r6  rX   r     s    


 zSQLCompiler.construct_paramsc                    s   t | dsd S | j| jjd kr<d kr<fdd nfdd i }| j}| jD ]@}||krlq^|jjr fdd|jjD ||< q^ |j||< q^|S )Nr   c                    s   |   }|S r   )dialect_implget_dbapi_type)typdbtype)dbapir   rT   rX   _lookup_typeJ  s    z=SQLCompiler._get_set_input_sizes_lookup.<locals>._lookup_typec                    sf   |  }|  }|d k	r^d ks>|kr^t|kr^d ksZ|ksZt|kr^|S d S d S r   )_unwrapped_dialect_implrE  rF  r   )rG  rE  rH  )rI  r   exclude_typesinclude_typesrT   rX   rJ  P  s$    

	

c                    s   g | ]} |qS rT   rT   )rV   rG  )rJ  rT   rX   
<listcomp>r  s    z;SQLCompiler._get_set_input_sizes_lookup.<locals>.<listcomp>)hasattrr   rI  literal_execute_paramsr   r   r,  r.  )r   rM  rL  Z
inputsizesrP  r/  rT   )rJ  rI  r   rL  rM  rX   _get_set_input_sizes_lookup7  s$    
	

z'SQLCompiler._get_set_input_sizes_lookupc                 C   s   | j ddS )zReturn the bind param dictionary embedded into this
        compiled object, for those values that are present.

        .. seealso::

            :ref:`faq_sql_expression_string` - includes a usage example for
            debugging use cases.

        F)rB  r   r   rT   rT   rX   r   z  s    zSQLCompiler.paramsc                    sd  |dkr| j dd}i }| jr$g }nd}| ji }| jrF| jrFtdi i }| jrZ| jn| j D ]< | jr~| j	  n }| j
  }|| jkr|kr| }	| j||	d|< qd|| jkr|kr|| }
n0| }| j}||||\}
}|
||< ||< |js||
 |jjrH| fddt|dD  n| fd	d|
D  | jr~|d
d |
D  dd |
D | < qd| jrd|  qdfdd}t| j|| j}t|||||}|r`|j| _| j|j |j| _t | _|jD ]Z}| j
|}| j| t |j!|j| D ](\}	}|"|	 | j
|< }|| j|< q2q|S )a  handle special post compile parameters.

        These include:

        * "expanding" parameters -typically IN tuples that are rendered
          on a per-parameter basis for an otherwise fixed SQL statement string.

        * literal_binds compiled with the literal_execute flag.  Used for
          things like SQL Server "TOP N" where the driver does not accommodate
          N as a bound parameter.

        NF)r   z\'post-compile' bind parameters are not supported with the 'numeric' paramstyle at this time.render_literal_valuec                 3   s`   | ]X\}}t |d D ]D\}} kr  |d   dk	rd ||f   |d   fV  qqdS )r   N%s_%s_%s	enumeraterV   ituple_elementjr*  r   r   rT   rX   r     s    zBSQLCompiler._process_parameters_for_postcompile.<locals>.<genexpr>r   c                 3   s&   | ]\}} kr|  fV  qd S r   rT   r)  r[  rT   rX   r     s   c                 s   s   | ]\}}|V  qd S r   rT   )rV   r   r*  rT   rT   rX   r     s     c                 S   s   g | ]\}}|qS rT   rT   )rV   Z
expand_keyr*  rT   rT   rX   rN    s    zCSQLCompiler._process_parameters_for_postcompile.<locals>.<listcomp>c                    sb   |  d}| }|  dr^|  dd}|d |d   d fdd|dD }|S )Nr   r   ~~r|   rc   c                 3   s   | ]}d  |f V  qdS z%s%s%sNrT   )rV   expbe_leftbe_rightrT   rX   r     s   z]SQLCompiler._process_parameters_for_postcompile.<locals>.process_expanding.<locals>.<genexpr>)r.   splitr3   )r!  r   exprtok)replacement_expressionsr_  rX   process_expanding  s    

zJSQLCompiler._process_parameters_for_postcompile.<locals>.process_expanding)#r   r   r1  r   r   r   r   valuesr9  r>  r   rP  r   render_literal_bindparampost_compile_params$_literal_execute_expanding_parameterliteral_executer   r   r,  rV  extendappendr'  r(  _post_compile_patternr   r}   r~   r   	frozensetr   r<  r*  Z_with_value)r   
parametersr   Zexpanded_parametersr   Znew_processorsZto_update_setsrD  	parameterr*  	to_updaterg  leepreplacement_exprrf  r~   Zexpanded_stater   r5  Zexpanded_key	new_paramrT   )r   r   re  rX   r    s    





  



 z/SQLCompiler._process_parameters_for_postcompilezsqlalchemy.engine.cursorc                 C   s   t jj}|j| jS )z(utility method used for unit tests only.)r   	preloadedZengine_cursorZCursorResultMetaDataZ_create_description_match_mapr   )r   cursorrT   rT   rX   _create_result_map5  s    zSQLCompiler._create_result_mapc                 C   s   | j d }|S )Nr   )Z_key_getters_for_crud_column)r   getterrT   rT   rX   _within_exec_param_key_getter=  s    
z)SQLCompiler._within_exec_param_key_getterzsqlalchemy.engine.resultc                    sz   t jj}| j| jj}fdd|jD |j  d k	rJ j	| j
d nd |dd |jD  fdd}|S )Nc                    s"   g | ]}t d  |d|fqS )r>  N)operatormethodcallerrV   r   )param_key_getterrT   rX   rN  J  s   zKSQLCompiler._inserted_primary_key_from_lastrowid_getter.<locals>.<listcomp>c                 S   s   g | ]
}|j qS rT   r   r}  rT   rT   rX   rN  X  s     c                    sL   dk	r   dkr.fddD S  fddD S dS )a  given cursor.lastrowid value and the parameters used for INSERT,
            return a "row" that represents the primary key, either by
            using the "lastrowid" or by extracting values from the parameters
            that were sent along with the INSERT.

            Nc                 3   s   | ]\}}| V  qd S r   rT   rV   ry  r   )rp  rT   rX   r   e  s     zWSQLCompiler._inserted_primary_key_from_lastrowid_getter.<locals>.get.<locals>.<genexpr>c                 3   s&   | ]\}}| krn|V  qd S r   rT   r  )autoinc_col	lastrowidrp  rT   rX   r   g  s   rT   r  rp  )r  gettersprocrow_fnr  rX   r>  Z  s    zDSQLCompiler._inserted_primary_key_from_lastrowid_getter.<locals>.get)r   rv  engine_resultrz  r~   rK   primary_keyZ_autoincrement_columnr   Z_cached_result_processorr   result_tupler   resultrK   r>  rT   )r  r  r~  r  r  rX   +_inserted_primary_key_from_lastrowid_getterB  s     
 z7SQLCompiler._inserted_primary_key_from_lastrowid_getterc                    sh   t jj}| j| jj}dd t| jD fdd|jD  |	dd |jD  fdd}|S )Nc                 S   s   i | ]\}}||qS rT   rT   )rV   idxr   rT   rT   rX   r   v  s      zKSQLCompiler._inserted_primary_key_from_returning_getter.<locals>.<dictcomp>c                    s<   g | ]4}|kr"t | d fnt d |ddfqS )Tr>  NF)r{  
itemgetterr|  r}  )r~  retrT   rX   rN  x  s   zKSQLCompiler._inserted_primary_key_from_returning_getter.<locals>.<listcomp>c                 S   s   g | ]
}|j qS rT   r   r}  rT   rT   rX   rN    s     c                    s    fddD S )Nc                 3   s&   | ]\}}|r|n| V  qd S r   rT   )rV   ry  Zuse_rowrp  rowrT   rX   r     s   zWSQLCompiler._inserted_primary_key_from_returning_getter.<locals>.get.<locals>.<genexpr>rT   )r  rp  )r  r  r  rX   r>    s    zDSQLCompiler._inserted_primary_key_from_returning_getter.<locals>.get)
r   rv  r  rz  r~   rK   rV  r  r  r  r  rT   )r  r~  r  r  rX   +_inserted_primary_key_from_returning_gettern  s    
z7SQLCompiler._inserted_primary_key_from_returning_getterc                 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   rT   r   rT   rT   rX   default_from  s    zSQLCompiler.default_fromc                 K   s   d|j j| f| d S N()r   r   )r   groupingasfromr   rT   rT   rX   visit_grouping  s    zSQLCompiler.visit_groupingc                 K   s   d|j j| f| d S r  r  )r   r  r   rT   rT   rX   visit_select_statement_grouping  s    z+SQLCompiler.visit_select_statement_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   r   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_elemrT   rT   rX   visit_label_reference  s<    	z!SQLCompiler.visit_label_referencec           
   
   K   s   | j s| |jS | j d d }|j\}}}z|r>||j }n
||j }W n8 tk
r }	 ztj|jdtj	|	d W 5 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.)extraZexc_clsr   r  r  )
r   r   Z_text_clauser  r   KeyErrorr   Z_no_text_coercionr   r;  )
r   r   r  r   r   r  r  r  r   r   rT   rT   rX   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	rj||
|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_r   format_label)r   r   add_to_result_mapr  r  r  result_map_targetsr   Zrender_label_with_asZrender_label_onlyZ	labelnamerT   rT   rX   visit_label  sJ    
zSQLCompiler.visit_labelc                 C   s   t dd S )Nz:Cannot compile Column object until its 'name' is assigned.r   r;  r   r   rT   rT   rX   _fallback_column_name  s    z!SQLCompiler._fallback_column_namec                 K   s   |j }| j|f|S r   )Z	_resolvedr   )r   r   r   Zsql_elementrT   rT   rX   visit_lambda_element  s    z SQLCompiler.visit_lambda_elementc                 K   s  |j  }}|d kr| |}|j}|s>t|tjr>| d|}|d k	rx|||jf| }	|jrh|	|jf7 }	||||	|j	 |r| 
|}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   	_tq_labelr   escape_literal_columnr   quoterK   Znamed_with_columnschema_for_objectquote_schema)r   r   r  include_tabler  r   r   	orig_namer  targetsrK   effective_schemaZschema_prefixZ	tablenamerT   rT   rX   visit_column  s4    

zSQLCompiler.visit_columnc                 K   s   | j |jS r   )r   format_collation	collationr   r   r   rT   rT   rX   visit_collationH  s    zSQLCompiler.visit_collationc                 K   s   |j S r   r   )r   Z
fromclauser   rT   rT   rX   visit_fromclauseK  s    zSQLCompiler.visit_fromclausec                 K   s   |j S r   r  )r   r   r   rT   rT   rX   visit_indexN  s    zSQLCompiler.visit_indexc                 K   s&   ||d< | j |d< | jjj|jf|S )Ntype_expressionr   )r   r   type_compilerr   r   )r   
typeclauser   rT   rT   rX   visit_typeclauseQ  s    
zSQLCompiler.visit_typeclausec                 C   s   | j jr|dd}|S N%%%r   _double_percentsreplacer   textrT   rT   rX   post_process_textV  s    zSQLCompiler.post_process_textc                 C   s   | j jr|dd}|S r  r  r  rT   rT   rX   r  [  s    z!SQLCompiler.escape_literal_columnc              	      sR    fdd}j sd_|r2|d d ftj tdd t|jS )Nc                    s:   |  d}|jkr(jj| f S j|f S d S r2  )r.   Z_bindparamsr   bindparam_string)r!  r   r   r   
textclauserT   rX   do_bindparama  s    

z2SQLCompiler.visit_textclause.<locals>.do_bindparamTc                 S   s
   |  dS r2  )r.   r   rT   rT   rX   r#  s  r$  z.SQLCompiler.visit_textclause.<locals>.<lambda>)	r   isplaintextr   NULLTYPEBIND_PARAMS_ESCr(  BIND_PARAMSr  r  )r   r  r  r   r  rT   r  rX   visit_textclause`  s     
zSQLCompiler.visit_textclausec                 K   s  | j  }|r| jn| j d }t t |d}| j | |jrX|jD ]}|j| f| qD|pz|dkrp|ddpz|dd}	|	r|j | _| _	|j ot
|j| _|jD ]}
| j|
d| jd q| j|jf|}| jr|st| j nd }| j||d	d
| }| j d |S )Nr
  correlate_fromsasfrom_fromsr
   r   need_result_map_for_compoundFr  Tr  r  visiting_ctenesting_levelr  )r   _default_stack_entryrI   rm  _independent_ctesr   r>  r   r  _textual_ordered_columnsr8  Zcolumn_args_loose_column_name_matchingr   _add_to_result_mapr   r   r3  _render_cte_clauser   )r   Ztafcompound_indexr  r   toplevelr  	new_entryctepopulate_result_mapcr  r  rT   rT   rX   visit_textual_selecty  sR    


	

z SQLCompiler.visit_textual_selectc                 K   s   dS NNULLrT   r   rc  r   rT   rT   rX   
visit_null  s    zSQLCompiler.visit_nullc                 K   s   | j jrdS dS d S )NrM   1r   supports_native_booleanr  rT   rT   rX   
visit_true  s    zSQLCompiler.visit_truec                 K   s   | j jrdS dS d S )Nr)   0r  r  rT   rT   rX   visit_false  s    zSQLCompiler.visit_falsec                    s$   | dd  fdd|D D S )Nc                 s   s   | ]}|r|V  qd S r   rT   rV   srT   rT   rX   r     s   z7SQLCompiler._generate_delimited_list.<locals>.<genexpr>c                 3   s   | ]}|j f V  qd S r   r   rV   r  r   r   rT   rX   r     s     r3   )r   r   	separatorr   rT   r   rX   _generate_delimited_list  s    
z$SQLCompiler._generate_delimited_listc                    sl   t jtjt jjt jj|\}}|dkr:|d jf S t	tj }|
dd  fdd|D D S d S )Nr   r   c                 s   s   | ]}|r|V  qd S r   rT   r  rT   rT   rX   r     s   z;SQLCompiler._generate_delimited_and_list.<locals>.<genexpr>c                 3   s   | ]}|j f V  qd S r   r   r  r   rT   rX   r     s     )r   ZBooleanClauseListZ_process_clauses_for_booleanr   and_ZTrue_Z
_singletonZFalse_r   r  r3   )r   clausesr   Zlccr  rT   r   rX   _generate_delimited_and_list  s    

z(SQLCompiler._generate_delimited_and_listc                 K   s   d| j |f| S N(%s))visit_clauselist)r   
clauselistr   rT   rT   rX   visit_tuple  s    zSQLCompiler.visit_tuplec                 K   s0   |j }|d krd}n
t|j  }| j|j|f|S N )r{  r  r  r  )r   r
  r   seprT   rT   rX   r	    s
    
zSQLCompiler.visit_clauselistc                 K   s   d}|j d k	r&||j j| f|d 7 }|jD ]4\}}|d|j| f| d |j| f| d 7 }q,|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   rW   Zcondr  rT   rT   rX   
visit_case  s*    

zSQLCompiler.visit_casec                 K   s   |j j| f|S r   )Ztyped_expressionr   )r   Ztype_coercer   rT   rT   rX   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  r   r  )r   r   r   rT   rT   rX   
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_CURRENTr   literalabs)r   range_r   rT   rT   rX   _format_frame_clause  s0    

z SQLCompiler._format_frame_clausec                    s   |j jf }|jr,dj|jf  }n |jrHdj|jf  }nd }d|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)r3  r   )rV   wordr  r   r   rT   rX   rN  ,  s    z*SQLCompiler.visit_over.<locals>.<listcomp>Z	PARTITIONORDER)r   r   r  r  Zrowsr3   Zpartition_byorder_by)r   Zoverr   r  r  rT   r  rX   
visit_over  s4    	zSQLCompiler.visit_overc                 K   s$   d|j j| f||jj| f|f S )Nz%s WITHIN GROUP (ORDER BY %s))r   r   r  )r   Zwithingroupr   rT   rT   rX   visit_withingroup9  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   rT   rT   rX   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>  fieldrc  r   )r   extractr   r   rT   rT   rX   visit_extractE  s
    zSQLCompiler.visit_extractc                 K   s*   | j |jf|}| j|f|}d||f S )Nz(%s).%s)visit_functionfnr  )r   r   r   Zcompiled_fnZcompiled_colrT   rT   rX   visit_scalar_function_columnL  s    z(SQLCompiler.visit_scalar_function_columnc                    s   |d k	r||j |j d|j td|j   d }|rD||f|}nt| jd   rj|jr d7  n6|j  j	
 st tjrj	 n   d  d fdd|jD  g dj|f|i }|jr|d7 }|S )	NrT   zvisit_%s_funcz%(expr)sr  c                    s4   g | ],}j |s t tjr,j |n|qS rT   )r   _requires_quotes_illegal_charsr  r   r   r  )rV   rd  r   r   rT   rX   rN  g  s   

z.SQLCompiler.visit_function.<locals>.<listcomp>rc  z WITH ORDINALITY)r   r   getattrlower	FUNCTIONSr>  Z_deannotate	__class__Z	_has_argsr   r&  r  r   r   r  r3   Zpackagenamesfunction_argspecZ_with_ordinality)r   r  r  r   dispr  rT   r'  rX   r#  Q  s:    


	zSQLCompiler.visit_functionc                 K   s   |  |jS r   )visit_sequencesequence)r   Z
next_valuer   rT   rT   rX   visit_next_value_funcw  s    z!SQLCompiler.visit_next_value_funcc                 K   s   t d| jj d S )Nz2Dialect '%s' does not support sequence increments.r   r   r   )r   r/  r   rT   rT   rX   r.  z  s
    zSQLCompiler.visit_sequencec                 K   s   |j j| f|S r   )Zclause_exprr   )r   r  r   rT   rT   rX   r,    s    zSQLCompiler.function_argspecc                    sz  j  }|j|f}|r(js(|_|j}|r8jnj d }|pV| oV|dd}	|dkrh||d< j |d |d |||	d |jr|jD ]}
|
jf qj	|j
}d	| d	  fd
dt|jD }dd< |j|ftf d i7 }|j|f7 }|jr4|j|f7 }jrj|sLtj nd }j|ddd| }j d |S )Nr
  r  Fr   select_0r  r  )r  r  r
   r   r  r  c                 3   s*   | ]"\}}|j f |d V  qdS ))r  r  Nr   )rV   rX  r  r  r   r   rT   rX   r     s    z4SQLCompiler.visit_compound_select.<locals>.<genexpr>r  r  Tr  r  include_following_stackr  )r   _compile_state_factoryr   r~   r  r>  rm  r  r   compound_keywordskeywordr3   rV  selectsgroup_by_clauser0  order_by_clause_has_row_limiting_clause_row_limit_clauser   r3  r  r   )r   csr  r  r   r  r   Zcompound_stmtr  Zneed_result_mapr  r8  r  r  rT   r3  rX   visit_compound_select  s\    



	 	z!SQLCompiler.visit_compound_selectc                 K   s*   |j d k	r| j|f|S | j|f|S d S r   )_fetch_clausefetch_clauselimit_clause)r   r>  r   rT   rT   rX   r=    s    
zSQLCompiler._row_limit_clausec                 C   s(   d|j ||rd| ndf }t| |d S )Nzvisit_%s_%s%s_r   )r   r(  )r   	operator_Z
qualifier1Z
qualifier2attrnamerT   rT   rX   _get_operator_dispatch  s    z"SQLCompiler._get_operator_dispatchc                 K   s   |d k	r"||f7 }||d< ||d< |j rt|jr8t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 )Nr  r  zFUnary expression does not support operator and modifier simultaneouslyunaryr{  modifierz,Unary expression has no operator or modifier)r{  rH  r   r;  rF   _generate_generic_unary_operatorr   _generate_generic_unary_modifier)r   rG  r  r  r   r-  rT   rT   rX   visit_unary  sN    
      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Z_is_implicitly_booleanr   r  r   r   r   r   r{  r   rT   rT   rX   visit_is_true_unary_operator  s    z(SQLCompiler.visit_is_true_unary_operatorc                 K   s:   |j s| jjr"d| j|jf| S d| j|jf| S d S )NNOT %sz%s = 0rL  rM  rT   rT   rX   visit_is_false_unary_operator  s    z)SQLCompiler.visit_is_false_unary_operatorc                 K   s   d| j |tjd S )NrO  )override_operator)visit_binaryr   match_opr   r   r{  r   rT   rT   rX   visit_not_match_op_binary  s     z%SQLCompiler.visit_not_match_op_binaryc                 K   s   d| j |t| f| S r  )_generate_generic_binaryr  rT  rT   rT   rX   visit_not_in_op_binary  s     z"SQLCompiler.visit_not_in_op_binaryc                 C   sv   |t jkr4t|dkr.dddd |D  S dS n>|t jkrht|dkrbdddd |D  S d	S n
| |S d S )
Nr   z(%s)) OR (1 = 1rc   c                 s   s   | ]
}d V  qdS r  NrT   rV   r   rT   rT   rX   r     s     z6SQLCompiler.visit_empty_set_op_expr.<locals>.<genexpr>zNULL) OR (1 = 1z(%s)) AND (1 != 1c                 s   s   | ]
}d V  qdS rX  rT   rY  rT   rT   rX   r   %  s     zNULL) AND (1 != 1)r   	not_in_opr3  r3   in_opvisit_empty_set_expr)r   r   	expand_oprT   rT   rX   visit_empty_set_op_expr  s    

z#SQLCompiler.visit_empty_set_op_exprc                 C   s   t d| jj d S )Nz3Dialect '%s' does not support empty set expression.r1  )r   Zelement_typesrT   rT   rX   r\  ,  s
    z SQLCompiler.visit_empty_set_exprc           	         sR  j j}|sP|jr<jjr$dndj jj }nj gj}n|js|jrt	|d t
jjrt	|d t
jt
j s|jrtdjjrdnddfddt|D  }n|r0j}||}|r|dstd	|dd
}|d |d   d fdd|D }ndfdd|D }d|fS )NVALUES r   r   z?bind_expression() on TupleType not supported with literal_bindsrc   c                 3   s8   | ]0\}}d d fddt| jjD  V  qdS )r  rc   c                 3   s   | ]\}}  ||V  qd S r   rR  )rV   r*  Z
param_typer   rT   rX   r   \  s   z[SQLCompiler._literal_execute_expanding_parameter_literal_binds.<locals>.<genexpr>.<genexpr>N)r3   r<  r   r.  )rV   rX  rY  rq  r   rT   rX   r   Y  s   
 zQSQLCompiler._literal_execute_expanding_parameter_literal_binds.<locals>.<genexpr>r   )unexpected format for expanding parameterr\  r   r|   c                 3   s&   | ]}d   |jf V  qdS r]  rS  r   rV   r*  r`  ra  rq  r   rT   rX   r   o  s   c                 3   s   | ]} | jV  qd S r   rb  rc  r`  rT   rX   r   y  s   rT   )r   rK  r   r,  tuple_in_valuesr^  r.  r]  _isnullr  r   collections_abcSequencestring_typesbinary_types_has_bind_expressionr   r3   rV  rn  searchr.   AssertionErrorrb  )	r   rq  rg  bind_expression_templatetyp_dialect_implreplacement_expressionZpost_compile_patternr!  rd  rT   rd  rX   2_literal_execute_expanding_parameter_literal_binds2  sb       




z>SQLCompiler._literal_execute_expanding_parameter_literal_bindsc                    s  |j r||S |jj}|sVg |jrB|jj|j}n|jg|j}n|js|j	rt
|d tjjrt
|d tjtj s|jrt fddt|dD jjrdnddfdd	t|D  }n0 fd
dt|dD dfdd	D }|fS )Nr   c                    s6   g | ].\}}t |d D ]\}}d ||f |fqqS )r   rT  rU  rW  r  rT   rX   rN    s    zDSQLCompiler._literal_execute_expanding_parameter.<locals>.<listcomp>r   r_  r   rc   c                 3   s8   | ]0\ d d  fddtD  V  qdS )r  rc   c                 3   s4   | ],\}}j d  t |  d i V  qdS )r   r   N)r   r3  )rV   rZ  r*  )rX  r   rr  rY  rT   rX   r     s   zMSQLCompiler._literal_execute_expanding_parameter.<locals>.<genexpr>.<genexpr>N)r3   rV  )rV   )r   rr  )rX  rY  rX   r     s   	zCSQLCompiler._literal_execute_expanding_parameter.<locals>.<genexpr>c                    s    g | ]\}}d  |f |fqS )z%s_%srT   )rV   rX  r*  r  rT   rX   rN    s   c                 3   s    | ]\}} j d |i V  qdS )r   N)r   r)  r   rT   rX   r     s    )rk  rq  r   rK  r   r,  r^  r.  r]  rf  r  r   rg  rh  ri  rj  Z	_is_arrayrm  rV  re  r3   )r   r   rq  rg  ro  rp  rT   )r   r   rr  rX   rj    sV        


	
z0SQLCompiler._literal_execute_expanding_parameterc              
   K   s   |rft |jrf|d k	rJ|d }|jt|jj|g |j	j|g  n|jt|jj|j	j | j
rt|jtjrt|j	tjrd|d< |p|j}| |dd }	|	r|	||f|S zt| }
W n: tk
r  } ztjt| ||d W 5 d }~X Y nX | j||
f||d|S d S )Nenclosing_lateralTrk  r   r   )from_linterlateral_from_linter)r   Zis_comparisonr{  r   r   r%  productr5   _from_objectsrF   ansi_bind_rulesr  r   ZBindParameterrF  r  r  r   r   r   r   rV  )r   r   rQ  eager_groupingrs  rt  r   rr  rD  r-  opstringr   rT   rT   rX   rR    sT    	 

zSQLCompiler.visit_binaryc                 K   s   | j |jf|S r   )r   Zsql_functionrM  rT   rT   rX   &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 %% ra   )r   r  r   r5   rF   rT  rT   rT   rX   visit_mod_binary  s    zSQLCompiler.visit_mod_binaryc                 K   s*   |j |d< | j|d| |j d f|S )Nrx  r  )rx  rV  r  ry  rM  rT   rT   rX   visit_custom_op_binary	  s    
z"SQLCompiler.visit_custom_op_binaryc                 K   s   | j || |jd f|S r  )rI  r  ry  rM  rT   rT   rX   visit_custom_op_unary_operator		  s     z*SQLCompiler.visit_custom_op_unary_operatorc                 K   s   | j |d| |j f|S r  )rJ  r  ry  rM  rT   rT   rX   visit_custom_op_unary_modifier	  s     z*SQLCompiler.visit_custom_op_unary_modifierc                 K   sf   | dd}d|d< |j|d< |jj| fd|i|| |jj| fd|i| }|rb|rbd| }|S )N
_in_binaryFT
_binary_oprx  r  )r>  r{  r5   r   rF   )r   r   ry  rx  r   r  r  rT   rT   rX   rV  	  s0    

z$SQLCompiler._generate_generic_binaryc                 K   s   ||j j| f| S r   r  r   rG  ry  r   rT   rT   rX   rI  )	  s    z,SQLCompiler._generate_generic_unary_operatorc                 K   s   |j j| f|| S r   r  r  rT   rT   rX   rJ  ,	  s    z,SQLCompiler._generate_generic_unary_modifierc                 C   s   t jdtjdS )Nz'%')r   )r   Zliteral_columnr   
STRINGTYPEr   rT   rT   rX   _like_percent_literal/	  s    z!SQLCompiler._like_percent_literalc                 K   s2   |  }| j}||j||_| j||f|S r   _cloner  concatrF   visit_like_op_binaryr   r   r{  r   percentrT   rT   rX   visit_contains_op_binary3	  s    z$SQLCompiler.visit_contains_op_binaryc                 K   s2   |  }| j}||j||_| j||f|S r   r  r  r  rF   visit_not_like_op_binaryr  rT   rT   rX   visit_not_contains_op_binary9	  s    z(SQLCompiler.visit_not_contains_op_binaryc                 K   s,   |  }| j}||j|_| j||f|S r   )r  r  _rconcatrF   r  r  rT   rT   rX   visit_startswith_op_binary?	  s    z&SQLCompiler.visit_startswith_op_binaryc                 K   s,   |  }| j}||j|_| j||f|S r   )r  r  r  rF   r  r  rT   rT   rX   visit_not_startswith_op_binaryE	  s    z*SQLCompiler.visit_not_startswith_op_binaryc                 K   s,   |  }| j}||j|_| j||f|S r   r  r  rT   rT   rX   visit_endswith_op_binaryK	  s    z$SQLCompiler.visit_endswith_op_binaryc                 K   s,   |  }| j}||j|_| j||f|S r   r  r  rT   rT   rX   visit_not_endswith_op_binaryQ	  s    z(SQLCompiler.visit_not_endswith_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 %s ESCAPE r   	modifiersr>  r5   r   rF   rS  r   r  r   r   r{  r   r  rT   rT   rX   r  W	  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 %sr  r   r  r  rT   rT   rX   r  d	  s    z$SQLCompiler.visit_not_like_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)r  r   r  r  rT   rT   rX   visit_ilike_op_binaryo	  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)r  r   r  r  rT   rT   rX   visit_not_ilike_op_binaryz	  s    z%SQLCompiler.visit_not_ilike_op_binaryc                 K   s&   |j dd}| j||rdndf|S )NrJ   Fz BETWEEN SYMMETRIC z	 BETWEEN r  r>  rV  r   r   r{  r   rJ   rT   rT   rX   visit_between_op_binary	  s     
z#SQLCompiler.visit_between_op_binaryc                 K   s&   |j dd}| j||rdndf|S )NrJ   Fz NOT BETWEEN SYMMETRIC z NOT BETWEEN r  r  rT   rT   rX   visit_not_between_op_binary	  s    
z'SQLCompiler.visit_not_between_op_binaryc                 K   s   t d| jj d S Nz/%s dialect does not support regular expressionsr   r;  r   r   rT  rT   rT   rX   visit_regexp_match_op_binary	  s
    z(SQLCompiler.visit_regexp_match_op_binaryc                 K   s   t d| jj d S r  r  rT  rT   rT   rX    visit_not_regexp_match_op_binary	  s
    z,SQLCompiler.visit_not_regexp_match_op_binaryc                 K   s   t d| jj d S )Nz;%s dialect does not support regular expression replacementsr  rT  rT   rT   rX   visit_regexp_replace_op_binary	  s
    z*SQLCompiler.visit_regexp_replace_op_binaryc                 K   s  |s|j | j}|jr||}	| j|	fd||o8|j ||d|}
|jrtd|
}|sft	dd|
d|
d|
df }
|r| j|fd|
d	|}d
| S |
S |s|p|jp|o| j}|p|j}nd}|r| j|fddi|}|jrd
| }|S | |}|| jkr| j| }||k	r|js@|jrp|j|jsp|j|jsptd| nF|j|jkrtd|f n&|js|jrtd|j|jf | | j|j< | j|< | j}|r
|jD ]*}|j|kr||j }|| | q|jrd| _|rR|r*d| _|rB|  j|hO  _n|  j|hO  _| j|f||jd|}|jr|d
| }|S )NT)skip_bind_expressionr  literal_bindsrk  render_postcompilez&^(.*)\(__\[POSTCOMPILE_(\S+?)\]\)(.*)$ra  z$(__[POSTCOMPILE_%s~~%s~~REPL~~%s~~])r   r   r|   )r  rn  r  Fr  zIBind parameter '%s' conflicts with unique bind parameter of the same namea  Can't reuse bound parameter name '%s' in both 'expanding' (e.g. within an IN expression) and non-expanding contexts.  If this parameter is to receive a list/array value, set 'expanding=True' on it for expressions that aren't IN, otherwise use a different parameter name.zbindparam() 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').)post_compile	expanding) r   rE  r   rk  bind_expressionr   r  r'  matchrm  r.   rh  rk  rw  _truncate_bindparamr   rO   r   intersectionZ_cloned_setr   r;  Z_is_crudr   r   rm  Z
isoutparamhas_out_parametersr  rP  ri  r  )r   r/  r  r  r  rk  r  r   implr  wrappedr!  r  r  r   existingr	  ZbpcbrT   rT   rX   visit_bindparam	  s    


	 


	




zSQLCompiler.visit_bindparamc           
      K   s   |t k	r|}nZ|jd krb|jd krb|dd }|rR|tjtjfkrRtd|j	f | j
tjf|S |j}|jr| j}||||d\}}	|	S | ||jS d S )Nr  zBound parameter '%s' rendering literal NULL in a SQL expression; comparisons to NULL should not use operators outside of 'is' or 'is not')rn  )r   r*  r@  r>  r   is_is_notr   Zwarn_limitedr   r   r   r  rA  r  rq  rS  r   )
r   r/  rS  rn  r   r*  oprs  rr  rt  rT   rT   rX   rh  5
  s(    
z$SQLCompiler.render_literal_bindparamc              
   C   s~   | | j}|rbz
||W S  tk
r^ } z&tjtdt||f |d W 5 d}~X Y qzX ntdt||f 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]Could not render literal value "%s" with datatype %s; see parent stack trace for more detail.r   NzNNo literal value renderer is available for literal value "%s" with datatype %s)	Z_cached_literal_processorr   	Exceptionr   r   r   r;  sql_utilZ_repr_single_value)r   r*  r   	processorerT   rT   rX   rS  V
  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_namerT   rT   rX   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   rC  r   )r   	apply_mapr   r3  r   r>  maxhex)r   Zident_classr   ZanonnamecounterZ	truncnamerT   rT   rX   r  
  s    z!SQLCompiler._truncated_identifierc                 C   s
   || j  S r   r   r   r   rT   rT   rX   
_anonymize
  s    zSQLCompiler._anonymizec                 K   s   | j r6|d k	r|| n| j| t| j| j|< |s\t|r\tdd |}|}|}|rv| j	sli | _	|| j	|< |rd| S | j
d|i S d S )Nc                 S   s   t | d S Nr   )_BIND_TRANSLATE_CHARSr.   r   rT   rT   rX   r#  
  r$  z.SQLCompiler.bindparam_string.<locals>.<lambda>z__[POSTCOMPILE_%s]r   )r   rm  r   r3  r   r   _BIND_TRANSLATE_RErl  r(  r9  r   )r   r   positional_namesr  r  Zescaped_fromr   new_namerT   rT   rX   r  
  s(    


zSQLCompiler.bindparam_stringc                    s      ||d< |j}t|tjr. d|}d}	d}
| }| jkrd j| \}}||ksxtn|j	rtt
 jnd}||f}| jkr j| }||k}
||jks||krd}	nV||jkrڈ j|= | } j|= n2|jd k	s|jd k	r||rd}	ntd| |s|	sd S |jd k	rR|j}|jj}t|tjrZ d|}n|}d }|	r8| j|< | j|< d|jjkrd jkr jd|jjd i _ jr| j|< | jkrԈ j|f| |s8| jkr8|jrd _ j||}|jrt|jtj r"|j}n,t|jtj!r@|jj"d }ndsNtd	d
d |#dD }|dd$ fdd|D  7 } jrg  |d<  j%|< |&dddkst js|jj' fd|i|S  j(||j)f|}|jj' fddi|}|d||f 7 }|j*r.|d j(||j*f| 7 }| j|< |r|rN||j+|< |	sh|
rh j||S |r j||} j,|r j-|}| .|7 }|S  j||S d S )Nr  r  TFr   z5Multiple, unrelated CTEs found with the same name: %rZ
autocommitr   z%cte should only be against SelectBasec                 S   s"   g | ]\}}}}}|s|p|qS rT   rT   )rV   rC  
proxy_namefallback_label_namer  repeatedrT   rT   rX   rN  ;  s   z)SQLCompiler.visit_cte.<locals>.<listcomp>r  rc   c                 3   s    | ]} j j| jd V  qdS )r  N)r   format_label_namer   )rV   identr   rT   rX   r   L  s
    z(SQLCompiler.visit_cte.<locals>.<genexpr>r  subqueryr  z AS %s
(%s)r  )/r  r   r  r   r  r  _get_reference_cter  rm  nestingr3  r   r  Z	_restatesr   Z_is_clone_ofcomparer   r;  Z
_cte_aliasr   r   r   rN   r   r  	visit_cte	recursiver  r   format_aliasr
   ZSelectCompoundSelectr9  Z_generate_columns_plus_namesr3   r  r>  r   _generate_prefixes	_prefixes	_suffixesr   _requires_quotesr  get_render_as_alias_suffix)r   r  r  ashint	fromhintsr  rs  r   cte_nameZ
is_new_cteZembedded_in_current_named_cteZ_reference_cter  rC  Zcte_level_nameZexisting_cteZexisting_cte_reference_cteZpre_alias_cteZcte_pre_alias_namer  Z
col_sourceZ
recur_colsprefixesr1   rT   r   rX   r  
  s    




 


 
	  

zSQLCompiler.visit_ctec                 K   s4   |j rd |d< |jr"| j|f|S | j|f|S d S )Nrs  )Zjoins_implicitly_is_lateralvisit_lateralvisit_aliasr  rT   rT   rX   visit_table_valued_alias  s
    z$SQLCompiler.visit_table_valued_aliasc                 K   s   | j |f|S r   )r  r  rT   rT   rX   visit_table_valued_column  s    z%SQLCompiler.visit_table_valued_columnc
              	      s  |r:dkr j st d< |	r:dkr:dkr:|	d< |d k	r|j kr jjf||||| d}|r|sz|rd|f }|S   }d< |s|rt jtjrd j}n j}|r҈j	
 |S |r|	r||	j <  jjfd|d}|rd|f }|j	
 | } jr^ jr^|dd	 fd
d jD  7 }|r |kr| |  |}|S  jjfd|iS d S )Nrr  rt  )r  r  iscrudr  lateralenclosing_aliasr  r  r  T)r  r  rc   c                 3   sB   | ]:}d j |j jr2djjj|jf ndf V  qdS )z%s%s %sr   N)r   r  r   Z_render_derived_w_typesr   r  r   r   r}  r  r   r   rT   rX   r     s   z*SQLCompiler.visit_alias.<locals>.<genexpr>r  )r  rm  r   r   r  r   r   r  r  r   r  r   r  Z_supports_derived_columnsZ_render_derivedr3   r  format_from_hint_text)r   r  r  r  r  r  r  r  r  rs  r   r1   Z
alias_namer  rT   r  rX   r    s    



 
   zSQLCompiler.visit_aliasc                 K   s   d|d< | j |f|S )NTr  r  )r   r  r   rT   rT   rX   visit_subquery  s    zSQLCompiler.visit_subqueryc                 K   s   d|d< d| j |f| S )NTr  z
LATERAL %sr  )r   Zlateral_r   rT   rT   rX   r    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  rT   rT   rX   visit_tablesample  s    
zSQLCompiler.visit_tablesamplec              	      s    d j dd fdd jD  }t jtjrNd j}n j} j	r`d}nd}|r|r|d k	rx|nd	|j
 < |rd
||j|dfdd jD f }nd||f }|S )Nr  z	VALUES %src   c                 3   s8   | ]0}|D ]&}j tj|d  ji fV  q
qdS )r.  N)r   r   TupleZ_column_typesr   )rV   chunkr   r   r   r   rT   rX   r     s    z+SQLCompiler.visit_values.<locals>.<genexpr>rg  zLATERAL r   z(unnamed VALUES element)z%s(%s)%s (%s)c                 3   s$   | ]}|j fd di V  qdS )r  FNr   r  r   rT   rX   r   '  s   z%s(%s))
setdefaultr  r3   _datar  r   r   r  r  r  r   r  r   r  columns)r   r   r  rs  r   vr   r  rT   r  rX   visit_values  s2    
zSQLCompiler.visit_valuesc                 C   s   d| S )Nrd   rT   )r   Zalias_name_textrT   rT   rX   r  3  s    z&SQLCompiler.get_render_as_alias_suffixc                 C   sD   |d ks|dkrd| _ d| _|jr,td| j||||f d S )N*FTzxMost backends don't support SELECTing from a tuple() object.  If this is an ORM query, consider using the Bundle object.)r  _ad_hoc_textualr,  r   r;  r   rm  )r   keynamer   objectsr   rT   rT   rX   r  6  s    zSQLCompiler._add_to_result_mapc                 K   s"   | j d|dd|dkri n|f|S )aL  Render a column with necessary labels inside of a RETURNING clause.

        This method is provided for individual dialects in place of calling
        the _label_select_column method directly, so that the two use cases
        of RETURNING vs. SELECT can be disambiguated going forward.

        .. versionadded:: 1.4.21

        NTF_label_select_column)r   stmtr   column_clause_argsr   rT   rT   rX   _label_returning_columnB  s    z#SQLCompiler._label_returning_columnc                    s  j | j}|jr(|s|r(|}n}|rh| j}|
rL|  fdd}ql|k	rl|  fdd}nd}|	sxtdttj	r|k	rt
|jjfd}n|}n|r|dk	stdt
|||jfd}n|k	rd}n~ttjr|oj ojdk	}nTttjr d	}n@ttjr<jp8|}n$ttjs\jdkr\d}nd	}|r|s||
rvtj}t|tjst|n|}t
|||fd}n|}|j|	|d
 |j| f|S )z.produce labeled columns present in a select().c                    s    | |d| d S )NrT   rT   r  r   r  r   )r  rT   rX   r  |  s    z;SQLCompiler._label_select_column.<locals>.add_to_result_mapc                    s    | |f| | d S r   rT   r  r  r   rT   rX   r    s       NzX_label_select_column is only relevant within the columns clause of a SELECT or RETURNING)r   z*proxy_name is required if 'name' is passedTFr  )r   rE  r   Z_has_column_expressionZcolumn_expressionr  rm  r  r   ZLabelr   r   r   r  ZColumnClauser  rK   Z
TextClauseZUnaryExpressionZwraps_column_expressionZNamedColumn_non_anon_labelZ_anon_name_labelr  r   r   )r   rG   r   r  r  r  r   r  r  r  column_is_repeatedneed_column_expressionsr  Zcol_exprr  Zresult_exprZrender_with_labelrT   r  rX   r  W  s      

   z SQLCompiler._label_select_columnc                 C   s    |  ||}|r|d| 7 }|S r  )get_from_hint_text)r   sqltextrK   hintr  hinttextrT   rT   rX   r    s    z!SQLCompiler.format_from_hint_textc                 C   s   d S r   rT   )r   ZbyfromsrT   rT   rX   get_select_hint_text  s    z SQLCompiler.get_select_hint_textc                 C   s   d S r   rT   r   rK   r  rT   rT   rX   r    s    zSQLCompiler.get_from_hint_textc                 C   s   d S r   rT   r  rT   rT   rX   get_crud_hint_text  s    zSQLCompiler.get_crud_hint_textc                 C   s
   d |S r  r  )r   Z
hint_textsrT   rT   rX   get_statement_hint_text  s    z#SQLCompiler.get_statement_hint_textr  r  c                 K   sh   | j  }|r| jn| j d }||| }|d }|d }	|rV|sV|j||	dd}
n|j||	d}
|
S )Nr
  r  r  rT   Zexplicit_correlate_fromsZimplicit_correlate_froms)r   r  r6  _get_display_froms
difference)r   select_stmtr  r  r   r  r  r   r  r  r   rT   rT   rX   _display_froms_for_select  s"    z%SQLCompiler._display_froms_for_selectc	              
      s  |d kst dd|	d< jf|	}
|
jj }|rFjsF|
_|d k	pP|}jrjfd i|	}|k	r|
}}|jf|	}
|
j|rjnjd }|p|ddp|dd |rdsd|	kr|	d= |
| ||}|		 
ddd	 d
}jr@\}}|rD||d 7 }nd }jrhjD ]}|jf|	 qRjr|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rXfddjD }|rX|d| 7 }jr|rl|r|s|tjnd }j||	dd| }jr|djjf|	 7 }jd |S )NzpSQLAlchemy 1.4 requires use of the translate_select_structure hook for structural translations of SELECT objectsFr  r  r
  r  r  r  )r  r  zSELECT r  c                 S   s   g | ]}|d k	r|qS r   rT   r  rT   rT   rX   rN    s   z,SQLCompiler.visit_select.<locals>.<listcomp>c                    s4   g | ],\}}}}}j | ||||d 
qS ))r   r  r  r   r  r  )rV   r   r  r  r   r  )r  r  r  r  r  r   rT   rX   rN    s$   c                 S   s   g | ]\}}}}}|qS rT   rT   rV   r   r  r  r   r  rT   rT   rX   rN    s   c                 S   s   g | ]\}}}}}|qS rT   rT   r  rT   rT   rX   rN    s   c                    s2   g | ]*\}}}}||t  fd d|D |fqS )c                 3   s   | ]}  ||V  qd S r   )r>  )rV   o	translaterT   rX   r     s     z6SQLCompiler.visit_select.<locals>.<listcomp>.<genexpr>)r-  )rV   r   r   r   r   r  rT   rX   rN    s   
c                    s$   g | ]\}}|d  j jfkr|qS r  r   r   )rV   dialect_nameZhtr   rT   rX   rN    s   r  r  )rm  r6  r~   r   r   translate_select_structurer  r>  _setup_select_stackcopyr   _hints_setup_select_hintsr  r   r  r  get_select_precolumnscolumns_plus_namesr0  r<  r   _compose_select_bodyZ_statement_hintsr	  r   r3  r  r  r   )r   r  r  insert_intor  r  Zselect_wraps_forr  rs  r   r   r  Zis_embedded_selectZnew_select_stmtZcompile_state_wraps_forr  r   r  	hint_textbyfromr  inner_columnsZper_dialectr  rT   )r  r  r  r  r  r   r  rX   visit_select3  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  r   r   r   )rV   r   r   r  r   rT   rX   rN    s   
z3SQLCompiler._setup_select_hints.<locals>.<listcomp>)r0  r  r=  r  )r   rG   r   r  rT   r   rX   r    s    

zSQLCompiler._setup_select_hintsc                 C   s   |d }|d }|dkr"||d< nD|rf|d }	t |	j}
t |j|
krftdd|
|d t |jf |r|s|j||dd}n|j||d}ttj	| }|
|}||||d	}| j| |S )
Nr  r  r   r2  z}All selectables passed to CompoundSelect must have identical numbers of columns; select #%d has %d columns, select #%d has %dr   rT   r
  )r  r  r
   r   )r3  Z_all_selected_columnsr  r   r;  r  r  rI   r
   rv  rN   r   rm  )r   rG   r   r  r  r  r  r  r  r2  Znumcolsr   Znew_correlate_fromsZall_correlate_fromsr  rT   rT   rX   r    sJ    


zSQLCompiler._setup_select_stackc	                    sx  |d |7 }jt@ r:ti t jt@ }	|rB_nd d}	|r|d7 }|jrx|d  fdd|D 7 }q|d fdd|D 7 }n| 7 }|j	rԈj
|j	fdi}
|
r|d|
 7 }|	r  |jr|j|f7 }|jr"j
|jf}
|
r"|d	|
 7 }|jr<|j|f7 }|jrV|j|f7 }|jd k	rt|j|f7 }|S )
Nrc   Fz 
FROM c                    s&   g | ]}|j fd  dqS )T)r  r  rs  r   rV   fr   rs  r   r   rT   rX   rN  _  s   z4SQLCompiler._compose_select_body.<locals>.<listcomp>c                    s$   g | ]}|j fd  dqS )Tr  rs  r   r$  )rs  r   r   rT   rX   rN  l  s   rs  z 
WHERE z	 
HAVING )r3   r   r   r   rI   r   rs  r  r  _where_criteriar  r   _group_by_clausesr:  Z_having_criteria_order_by_clausesr;  r<  r=  Z_for_update_argfor_update_clause)r   r  rG   r   r!  r   r   r  r   Zwarn_lintingtrT   r&  rX   r  D  sf    

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 r   r#  )rV   prefixr  r   rT   rX   r     s    z1SQLCompiler._generate_prefixes.<locals>.<genexpr>r  )r   r  r  r   r  rT   r   rX   r    s    zSQLCompiler._generate_prefixesc                    s  j s
dS |rx|dkrxt }tj  D ]H}j|  \}}||kpX|oX||d k}|jr,|sfq,j | ||< q,nj }|sdS tdd |D }	j	rj
| | |dkrj
rjdk	st fdd fdd	 d}
j|
|_|	d
 }|ddd | D 7 }|d7 }|r|dkrt| D ]8}j|  \}}j |= j||f= j| = qL|S )z
        include_following_stack
            Also render the nesting CTEs on the next stack. Useful for
            SQL structures like UNION or INSERT that can wrap SELECT
            statements containing nesting CTEs.
        r   r   c                 S   s   g | ]
}|j qS rT   )r  )rV   r  rT   rT   rX   rN    s     z2SQLCompiler._render_cte_clause.<locals>.<listcomp>Nc                    sr   | j kr`j | }ttj fdd|D }| jkrZj|  |j|d  S |S nj| g S d S )Nc                 3   s   | ]} |V  qd S r   rT   )rV   Z	child_cte)get_nested_positionalrT   rX   r     s   zPSQLCompiler._render_cte_clause.<locals>.get_nested_positional.<locals>.<genexpr>r   )	r  r   r  r%  chainfrom_iterabler  r  r>  )r  childrento_addr.  reorder_positionalr   rT   rX   r.    s    

z=SQLCompiler._render_cte_clause.<locals>.get_nested_positionalc                    sX   |s||  S d}t t| D ]\}} j| |k r q8q| d |  | | | d   S r  )rV  reversedr   )posr2  levelr   r   r   rT   rX   r4    s    z:SQLCompiler._render_cte_clause.<locals>.reorder_positionalr  , 
c                 S   s   g | ]}|qS rT   rT   )rV   txtrT   rT   rX   rN    s     z
 )r   r   r  r  keysr  r  r  r   r   r  rl  r   rm  get_cte_preambler3   rg  r  )r   r  r5  r  r   r  r  r  Zis_rendered_levelr  r2  Zcte_textrT   r3  rX   r    sT    
	  zSQLCompiler._render_cte_clausec                 C   s   |rdS dS d S )NzWITH RECURSIVEZWITHrT   )r   r  rT   rT   rX   r;    s    zSQLCompiler.get_cte_preamblec                 K   s"   |j rtjddd |jrdS dS )zcCalled when building a ``SELECT`` statement, position is just
        before column list.

        a  DISTINCT ON is currently supported only by the PostgreSQL dialect.  Use of DISTINCT ON for other backends is currently silently ignored, however this usage is deprecated, and will raise CompileError in a future release for all backends that do not support this syntax.z1.4versionre   r   )Z_distinct_onr   warn_deprecatedZ	_distinctr   rG   r   rT   rT   rX   r    s    z!SQLCompiler.get_select_precolumnsc                 K   s,   | j |jtt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  r   comma_op)r   rG   r   Zgroup_byrT   rT   rX   r:    s     zSQLCompiler.group_by_clausec                 K   s,   | j |jtt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  r   r@  )r   rG   r   r  rT   rT   rX   r;    s     zSQLCompiler.order_by_clausec                 K   s   dS )Nz FOR UPDATErT   r?  rT   rT   rX   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   r  returning_colsrT   rT   rX   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 )Z_limit_clauser   _offset_clauser   rG   r   r  rT   rT   rX   rB  3  s    


zSQLCompiler.limit_clausec                 K   sn   d}|j d k	r&|d| j|j f| 7 }|jd k	rj|d| j|jf||jd rPdnd|jd r`dndf 7 }|S )	Nr   z
 OFFSET %s ROWSz
 FETCH FIRST %s%s ROWS %sr  z PERCENTZ	with_tiesz	WITH TIESZONLY)rC  r   r@  Z_fetch_clause_optionsrD  rT   rT   rX   rA  =  s     

zSQLCompiler.fetch_clausec                 K   s   |r|j |j|< |s|r~| j|}	|rL|	rL| j|	d | j|j }
n| j|j}
|rz||krz| |
||| |}
|
S dS d S )Nr  r   )fullnamer   r   r  r  r  r   r  )r   rK   r  r  r  r  
use_schemars  r   r  r  rT   rT   rX   visit_tableM  s*    
   zSQLCompiler.visit_tablec                 K   s   |r |j t|jj|jj |jr,d}n|jr8d}nd}|jj	| fd|d|| |jj	| fd|d| d |j
j	| fd|i| S )Nz FULL OUTER JOIN z LEFT OUTER JOIN z JOIN Tr'  z ON rs  )r   r   r%  ru  r5   rv  rF   r-   Zisouterr   Zonclause)r   r3   r  rs  r   Z	join_typerT   rT   rX   
visit_joinn  sT       	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  r  )rV   rK   r   r  r   rT   rX   rN    s   
z1SQLCompiler._setup_crud_hints.<locals>.<listcomp>T)r0  r  r=  rK   r  )r   r  
table_textdialect_hintsrT   r   rX   _setup_crud_hints  s    

   zSQLCompiler._setup_crud_hintsc                 K   s8  |j || f|}|j}| j }|r@d| _| js4|| _| js@|| _| jt t |d tj	| ||f|}|s| j
js| j
js| j
jstd| j
j |jr| j
jstd| j
j |d }n|}| j}| j
j}d}	|jr|	| j||jf|7 }	|	d7 }	||j}
|jr | ||
\}}
|jrD|jD ]}|j| f| q.|	|
7 }	|sX|st|	dd	d
d |D  7 }	| js|jr| || jp|j}| j r|	d| 7 }	nd }|j!d k	r8| j"| jd d fddi|}| j#r*| j
j$r*|st%| jnd }|	d| j&|d|'dd|f 7 }	n|	d| 7 }	nh|sN|rN|	d7 }	nR|jrt|	dd	dd |D  7 }	n,d	dd |D }|	d| 7 }	|r|| _(|j)d k	r| j"|j)f|}|r|	d| 7 }	|r| j s|	d| 7 }	| j#r(| j
j$s(|s
t%| jnd }| j&|d|'dd|	 }	| j*d |	S )NTr  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  (%s)rc   c                 S   s   g | ]\}}}|qS rT   rT   rV   r  rc  r*  rT   rT   rX   rN    s     z,SQLCompiler.visit_insert.<locals>.<listcomp>r  r
  Zinsert_from_selectr  z %s%sr  r4  r  z DEFAULT VALUESz
 VALUES %sc                 s   s&   | ]}d d dd |D  V  qdS )r  rc   c                 s   s   | ]\}}}|V  qd S r   rT   rM  rT   rT   rX   r   	  s     z5SQLCompiler.visit_insert.<locals>.<genexpr>.<genexpr>Nr  )rV   Zcrud_param_setrT   rT   rX   r     s   z+SQLCompiler.visit_insert.<locals>.<genexpr>c                 S   s   g | ]\}}}|qS rT   rT   rM  rT   rT   rX   rN    s     z VALUES (%s))+r6  r~   r   r   r   r   rm  rI   r   _get_crud_paramsr   supports_default_valuesZsupports_default_metavalueZsupports_empty_insertr   r;  r   Z_has_multi_parametersZsupports_multivalues_insertr   r  r  format_tablerK   r  rK  r  r   r3   r  r  rB  returning_precedes_valuesrG   r   r   Zcte_follows_insertr3  r  r>  insert_single_values_exprZ_post_values_clauser   )r   Zinsert_stmtr   r   r  crud_paramsZcrud_params_singler   rO  r  rI  rC  r  rB  Zselect_textr  rR  Zpost_values_clauserT   rT   rX   visit_insert  s      
 
 
	

	zSQLCompiler.visit_insertc                 C   s   dS )z3Provide a hook for MySQL to add LIMIT to the UPDATENrT   )r   update_stmtrT   rT   rX   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   rU  
from_tableextra_fromsr   rT   rT   rX   update_tables_clause2  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 UPDATENr   r   rU  rW  rX  
from_hintsr   rT   rT   rX   update_from_clause<  s    	zSQLCompiler.update_from_clausec                    sr  |j || f|}|j}| j }|r@d| _| js4|| _| js@|| _|j}t|}|rtt	
|j  fdd|D } |}ng }|jh}| j|||d d}	|jr|	| j||jf|7 }	| j||j|f|}
tj| ||f|}|jr| ||
\}}
nd }|jr&|jD ]}|j| f| q|	|
7 }	|	d7 }	|	ddd	 |D 7 }	| js^|jr| jr|	d
| || jp||j 7 }	|r| j||j||f|}|r|	d
| 7 }	|jr| j|jf|}|r|	d| 7 }	| |}|r|	d
| 7 }	| js|jr.| js.|	d
| || jp&|j 7 }	| j rb|sFt!| jnd }| j"||#dd|	 }	| j$d |	S )NTc                    s   g | ]}| kr|qS rT   rT   r$  Z
main_fromsrT   rX   rN  ^  s     z,SQLCompiler.visit_update.<locals>.<listcomp>r  zUPDATE z SET rc   c                 s   s    | ]\}}}|d  | V  qdS )=NrT   rM  rT   rT   rX   r     s     z+SQLCompiler.visit_update.<locals>.<genexpr>r   WHERE r  r  r
  )%r6  r~   r   r  r   r   _extra_fromsr8  rI   r
   rv  rK   rN   rm  r  r  rY  r   rN  r  rK  r  r   r3   r  r  rQ  rB  r\  r(  r  rV  r   r3  r  r>  r   )r   rU  r   r   r  rX  Zis_multitableZrender_extra_fromsr  r  rI  rS  rJ  r  extra_from_textr,  rB  r  rT   r]  rX   visit_updateJ  s     
      

 
 zSQLCompiler.visit_updatec                 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 DELETENr   rZ  rT   rT   rX   delete_extra_from_clause  s    z$SQLCompiler.delete_extra_from_clausec                 C   s   |j | dddS )NT)r  r  r   )r   delete_stmtrW  rX  rT   rT   rX   delete_table_clause  s    zSQLCompiler.delete_table_clausec                 K   s  |j || f|}|j}| j }|r@d| _| js4|| _| js@|| _|j}|jh|}| j	|||d d}|j
r|| j||j
f|7 }|d7 }| ||j|}|jr| ||\}	}nd }	|jr|jD ]}
|
j| f| q||7 }|jr
| jr
|d| ||j 7 }|r8| j||j||	f|}|r8|d| 7 }|jrb| j|jf|}|rb|d| 7 }|jr| js|d| ||j 7 }| jr|st| jnd }| j||dd| }| jd	 |S )
NTr  zDELETE FROM r  r_  r  r  r
  )r6  r~   r   r  r   r   r`  rK   rN   rm  r  r  re  r  rK  r  r   r  rQ  rB  rc  r(  r  r   r3  r  r>  r   )r   rd  r   r   r  rX  r  r  rI  rJ  r  ra  r,  r  rT   rT   rX   visit_delete  s         

  zSQLCompiler.visit_deletec                 C   s   d| j | S )NzSAVEPOINT %sr   format_savepointr   Zsavepoint_stmtrT   rT   rX   visit_savepoint-  s    zSQLCompiler.visit_savepointc                 C   s   d| j | S )NzROLLBACK TO SAVEPOINT %srh  rj  rT   rT   rX   visit_rollback_to_savepoint0  s    z'SQLCompiler.visit_rollback_to_savepointc                 C   s   d| j | S )NzRELEASE SAVEPOINT %srh  rj  rT   rT   rX   visit_release_savepoint5  s    z#SQLCompiler.visit_release_savepoint)NNTNT)NN)NF)F)F)F)NFFNrT   )NTrT   )N)NF)N)FN)NrT   )N)NFNN)F)FFFFF)NFFN)FFNNN)FFFNFFNN)F)FN)N)NNNTFF)F)FFNNNFN)NFN)FFFNTN)FN)r   r   r   r   EXTRACT_MAPr  COMPOUND_KEYWORDSr7  r  r   r  r  r  rQ  Z'render_table_with_column_in_update_fromrw  r  r  r  r  r   r  rR  ro  rP  ri  r   r   r9  r  r  r  Zpostfetch_lastrowidr   r'  compilern  r   r   r  r   r   r   r  r  memoized_propertyr  Zmemoized_instancemethodr  
contextlibcontextmanagerr  r  r1  r4  r   r   rQ  r   r  preload_modulerx  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%  r#  r0  r.  r,  r?  r=  rF  rK  rN  rP  rU  rW  r^  r\  rq  rj  rR  rz  r{  r|  r}  r~  rV  rI  rJ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   rh  rS  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+  rB  rB  rA  rG  rH  rK  rT  rV  rY  r\  rb  rc  re  rg  rk  rl  rm  rT   rT   rT   rX   r   8  s2  
		

o
%





    
s  B
  
 /

*	
'
!    
1  
/  
<	&  
C	  
'		
N=   
6

	    
 
!&   
)    
 =       
c/
     
 #

      
 O4T  [
     ! 
s]r   c                       s   e Zd ZdZdd Zed f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  Z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>rT   r  rT   rT   rX   r  O  s    z$StrSQLCompiler._fallback_column_namezsqlalchemy.engine.urlc                    sX   |j dkrFtjj}|j|j   }||d }t|t	sF|
|S tt	| ||S )Nr#   )Zstringify_dialectr   rv  Z
engine_urlURLr   get_dialectstatement_compilerr  ru  r   superr   )r   r   r   r   urlr   compilerr+  rT   rX   r   R  s    



 z,StrSQLCompiler.visit_unsupported_compilationc                 K   s$   d| j |jf|| j |jf|f S )Nz%s[%s])r   r5   rF   rT  rT   rT   rX   visit_getitem_binary`  s    z#StrSQLCompiler.visit_getitem_binaryc                 K   s   | j ||f|S r   r}  rT  rT   rT   rX   visit_json_getitem_op_binaryf  s    z+StrSQLCompiler.visit_json_getitem_op_binaryc                 K   s   | j ||f|S r   r~  rT  rT   rT   rX   !visit_json_path_getitem_op_binaryi  s    z0StrSQLCompiler.visit_json_path_getitem_op_binaryc                 K   s   d| j | S )Nz<next sequence value: %s>)r   format_sequence)r   seqr   rT   rT   rX   r.  l  s    zStrSQLCompiler.visit_sequencec                    s&    fddt |D }dd| S )Nc              
      s$   g | ]} j d |ddi |jdqS )NTF)r  )r  r  r  r   rT   rX   rN  p  s        z3StrSQLCompiler.returning_clause.<locals>.<listcomp>z
RETURNING rc   )r   Z_select_iterablesr3   )r   r  rA  r  rT   r   rX   rB  o  s    
zStrSQLCompiler.returning_clausec                    s(   dd< dd  fdd|D  S )NTr  rf  rc   c                 3   s$   | ]}|j fd  iV  qdS r  Nr   rV   r,  r[  r   r   rT   rX   r   }  s   z4StrSQLCompiler.update_from_clause.<locals>.<genexpr>r  rZ  rT   r  rX   r\  y  s    z!StrSQLCompiler.update_from_clausec                    s(   dd< dd  fdd|D  S )NTr  rc   c                 3   s$   | ]}|j fd  iV  qdS r  r   r  r  rT   rX   r     s   z:StrSQLCompiler.delete_extra_from_clause.<locals>.<genexpr>r  rZ  rT   r  rX   rc    s    z'StrSQLCompiler.delete_extra_from_clausec                 C   s   dS )NzSELECT 1 WHERE 1!=1rT   )r   r   rT   rT   rX   r\    s    z#StrSQLCompiler.visit_empty_set_exprc                 C   s   d| S )Nz[%s]rT   r  rT   rT   rX   r    s    z!StrSQLCompiler.get_from_hint_textc                 K   s   | j |df|S )Nz
 <regexp> rV  rT  rT   rT   rX   r    s    z+StrSQLCompiler.visit_regexp_match_op_binaryc                 K   s   | j |df|S )Nz <not regexp> r  rT  rT   rT   rX   r    s    z/StrSQLCompiler.visit_not_regexp_match_op_binaryc                 K   s:   |j d }d|jj| f||jj| f||j| f|f S )Nreplacementz<regexp replace>(%s, %s, %s))r  r5   r   rF   )r   r   r{  r   r  rT   rT   rX   r    s    
z-StrSQLCompiler.visit_regexp_replace_op_binary)r   r   r   r   r  r   rt  r   r}  r  r  r.  rB  r\  rc  r\  r  r  r  r  __classcell__rT   rT   r|  rX   ru  ;  s    
		ru  c                   @   sd  e Zd Zejdd Zejdd ZdTddZd	d
 Zdd Z	dd Z
dd ZdUddZdVddZdd Zdd Zdd ZdWddZdd ZdXd d!Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- ZdYd.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)dNdO Z*dPdQ Z+dRdS Z,dS )ZDDLCompilerc                 C   s   | j j| j d | jdS )Nr   )r   rx  r   r   rT   rT   rX   r     s
      zDDLCompiler.sql_compilerc                 C   s   | j jS r   )r   r  r   rT   rT   rX   r    s    zDDLCompiler.type_compilerNTc                 C   s   d S r   rT   r   rT   rT   rX   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
  rK   r	   rE  )contextr  targetr	   ZTabler  r   format_table_seqr3  r  rP  r   r  r~   )r   Zddlr   r  r   pathrK   ZschrT   rT   rX   	visit_ddl  s    zDDLCompiler.visit_ddlc                 K   s   | j |j}d| S )NzCREATE SCHEMA )r   format_schemar   )r   r   r   r	   rT   rT   rX   visit_create_schema  s    zDDLCompiler.visit_create_schemac                 K   s(   | j |j}d| }|jr$|d7 }|S )NzDROP SCHEMA  CASCADE)r   r  r   cascade)r   dropr   r	   r  rT   rT   rX   visit_drop_schema  s
    zDDLCompiler.visit_drop_schemac                 K   sd  |j }| j}d}|jr*|d|jd 7 }|d7 }|jr@|d7 }|||d 7 }| |}|rl||d 7 }|d7 }d}d}|jD ]}	|	j }
zD| j|	|
j	o| d}|d k	r||7 }d	}|d
| 7 }|
j	rd}W q t
jk
r$ } z2tjt
td|j|
j|jd f |d W 5 d }~X Y qX q| j||jd}|rN||d
 | 7 }|d| | 7 }|S )Nz
CREATE r  zTABLE IF NOT EXISTS r  
Ffirst_pkr8  	Tz (in table '%s', column '%s'): %sr   r  ) _include_foreign_key_constraintsz
)%s

)r   r   r  r3   if_not_existsrP  create_table_suffixr  r   r  r   r;  r   r   udescriptionr   argscreate_table_constraintsZinclude_foreign_key_constraintspost_create_table)r   r   r   rK   r   r  r  r  r  Zcreate_columnr   	processedZceconstrT   rT   rX   visit_create_table  sZ    

 
zDDLCompiler.visit_create_tableFc                    sL   |j }|jrd S  j||d}d fdd|jD }|rH|d| 7 }|S )Nr  r  c                 3   s   | ]}  |V  qd S r   )r   rV   r   r   rT   rX   r     s    z2DDLCompiler.visit_create_column.<locals>.<genexpr>)r   systemget_column_specificationr3   constraints)r   r   r  r   r   r  r  rT   r   rX   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 rT   )r  r  )	omit_fkcsrK   rT   rX   rN  %  s   
 z8DDLCompiler.create_table_constraints.<locals>.<listcomp>z, 
	c                 s   s   | ]}|d k	r|V  qd S r   rT   )rV   prT   rT   rX   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_ruler   Zsupports_alterr(  r   r  r   rT   rX   r   .  s   

)r  rm  Zforeign_key_constraintsr  rI   rl  Z_sorted_constraintsr3   )r   rK   r  r   r  Zall_fkcsrT   )r  r   rK   rX   r    s"    

z$DDLCompiler.create_table_constraintsc                 K   s$   d}|j r|d7 }|| j|j S )Nz
DROP TABLE 
IF EXISTS )	if_existsr   rP  r   )r   r  r   r  rT   rT   rX   visit_drop_table=  s    zDDLCompiler.visit_drop_tablec                 K   s   d| j |j S )Nz
DROP VIEW r   rP  r   r   r  r   rT   rT   rX   visit_drop_viewC  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.)rK   r   r;  r   r   r   rT   rT   rX   _verify_index_tableF  s    
zDDLCompiler._verify_index_tablec              	      s   |j } |  j}d}|jr(|d7 }|jd kr<td|d7 }|jrR|d7 }|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 r  z%s ON %s (%s)include_schemarF  rc   c                 3   s    | ]} j j|d ddV  qdS )FTr  r  N)r   r   )rV   rc  r   rT   rX   r   c  s     z1DDLCompiler.visit_create_index.<locals>.<genexpr>)r   r  r   rO   r   r   r;  r  _prepared_index_namerP  rK   r3   Zexpressions)r   r   r  Zinclude_table_schemar   r   r   r  rT   r   rX   visit_create_indexL  s0    

 zDDLCompiler.visit_create_indexc                 K   s>   |j }|jd krtdd}|jr,|d7 }|| j|dd S )Nz.DROP INDEX requires that the index have a namez
DROP INDEX r  Tr  )r   r   r   r;  r  r  )r   r  r   r   r  rT   rT   rX   visit_drop_indexl  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  )rK   r   r  r  format_index)r   r   r  r  Zschema_nameZ
index_namerT   rT   rX   r  y  s    
z DDLCompiler._prepared_index_namec                 K   s    d| j |jj| |jf S )NzALTER TABLE %s ADD %s)r   rP  r   rK   r   r   r   r   rT   rT   rX   visit_add_constraint  s    
z DDLCompiler.visit_add_constraintc                 K   s(   d| j |j| j|jjt f S )NzCOMMENT ON TABLE %s IS %s)r   rP  r   r   rS  commentr   Stringr  rT   rT   rX   visit_set_table_comment  s     z#DDLCompiler.visit_set_table_commentc                 K   s   d| j |j S )NzCOMMENT ON TABLE %s IS NULLr  r  rT   rT   rX   visit_drop_table_comment  s    z$DDLCompiler.visit_drop_table_commentc                 K   s.   d| j j|jddd| j|jjt f S )NzCOMMENT ON COLUMN %s IS %sT)	use_tablerF  )r   format_columnr   r   rS  r  r   r  r  rT   rT   rX   visit_set_column_comment  s       z$DDLCompiler.visit_set_column_commentc                 K   s   d| j j|jdd S )NzCOMMENT ON COLUMN %s IS NULLT)r  )r   r  r   r  rT   rT   rX   visit_drop_column_comment  s     z%DDLCompiler.visit_drop_column_commentc                 C   s   g }|j d k	r|d|j   |jd k	r8|d|j  |jd k	rR|d|j  |jd k	rl|d|j  |jd k	r|d |jd k	r|d |jd k	r|d|j  |jd k	r||jrdnd	 |j	d k	r||j	rd
nd d
|S )NzINCREMENT BY %dzSTART WITH %dzMINVALUE %dzMAXVALUE %dzNO MINVALUEzNO MAXVALUEzCACHE %dr  zNO ORDERZCYCLEzNO CYCLEr  )	incrementrm  r   ZminvalueZmaxvalueZ
nominvalueZ
nomaxvaluecacherC   cycler3   )r   Zidentity_optionsr  rT   rT   rX   get_identity_options  s(    










z DDLCompiler.get_identity_optionsc                 K   sV   d| j |j }|r||7 }|jjd kr6| jj|j_| |j}|rR|d| 7 }|S )NzCREATE SEQUENCE %sr  )r   r  r   r   r   Zdefault_sequence_baser  )r   r   r-  r   r  optionsrT   rT   rX   visit_create_sequence  s    z!DDLCompiler.visit_create_sequencec                 K   s   d| j |j S )NzDROP SEQUENCE %s)r   r  r   r  rT   rT   rX   visit_drop_sequence  s    zDDLCompiler.visit_drop_sequencec                 K   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%sr  r   )	r   r   r   format_constraintr   r;  rP  rK   r  )r   r  r   r   formatted_namerT   rT   rX   visit_drop_constraint  s    
z!DDLCompiler.visit_drop_constraintc                 K   s   | j |d | jjj|j|d }| |}|d k	rB|d| 7 }|jd k	r`|d| |j 7 }|jd k	r| jj	r|d| |j 7 }|j
s|jr| jj	s|d7 }|S )Nr  )r  z	 DEFAULT z	 NOT NULL)r   r  r   r  r   r   get_column_default_stringZcomputedidentityZsupports_identity_columnsZnullable)r   r   r   Zcolspecr#   rT   rT   rX   r    s4    
 

z$DDLCompiler.get_column_specificationc                 C   s   dS Nr   rT   r   rK   rT   rT   rX   r    s    zDDLCompiler.create_table_suffixc                 C   s   dS r  rT   r  rT   rT   rX   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)r  )r  Zserver_defaultr	   ZDefaultClauseargr   ri  r   rS  r   r  r   r  rT   rT   rX   r    s      z%DDLCompiler.get_column_default_stringc                 K   s   |j r| |S | |S d S r   )Zis_column_levelvisit_column_check_constraintvisit_check_constraint)r   r   r   rT   rT   rX   &visit_table_or_column_check_constraint  s    
z2DDLCompiler.visit_table_or_column_check_constraintc                 K   s\   d}|j d k	r.| j|}|d k	r.|d| 7 }|d| jj|jddd 7 }|| |7 }|S Nr   CONSTRAINT %s z
CHECK (%s)FTr  r   r   r  r   r   r  define_constraint_deferrabilityr   r   r   r  r  rT   rT   rX   r    s    

  
z"DDLCompiler.visit_check_constraintc                 K   s\   d}|j d k	r.| j|}|d k	r.|d| 7 }|d| jj|jddd 7 }|| |7 }|S r  r  r  rT   rT   rX   r  #  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   r  zPRIMARY KEY r  rc   c                 3   s   | ]} j |jV  qd S r   r   r  r   r  r   rT   rX   r   8  s   z;DDLCompiler.visit_primary_key_constraint.<locals>.<genexpr>)	r3  r   r   r  r3   Z_implicit_generatedZcolumns_autoinc_firstr  r  r  rT   r   rX   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   r  r   z"FOREIGN KEY(%s) REFERENCES %s (%s)rc   c                 3   s   | ]}  |jjV  qd S r   )r  parentr   r$  r   rT   rX   r   L  s    z;DDLCompiler.visit_foreign_key_constraint.<locals>.<genexpr>c                 3   s   | ]}  |jjV  qd S r   )r  r   r   r$  r  rT   rX   r   R  s    )r   r   r  r  r   r   rK   r3   define_constraint_remote_tabledefine_constraint_matchdefine_constraint_cascadesr  )r   r   r   r  r  Zremote_tablerT   r  rX   visit_foreign_key_constraintC  s0    
  z(DDLCompiler.visit_foreign_key_constraintc                 C   s
   | |S )z=Format the remote table clause of a CREATE CONSTRAINT clause.)rP  )r   r   rK   r   rT   rT   rX   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   r  zUNIQUE (%s)rc   c                 3   s   | ]} j |jV  qd S r   r  r  r   rT   rX   r   i  s     z6DDLCompiler.visit_unique_constraint.<locals>.<genexpr>)r3  r   r   r  r3   r  r  rT   r   rX   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ondeleter   validate_sql_phraseFK_ON_DELETEZonupdateFK_ON_UPDATEr   r   r  rT   rT   rX   r  n  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$   r0   r   r  FK_INITIALLYr  rT   rT   rX   r  z  s    



 z+DDLCompiler.define_constraint_deferrabilityc                 C   s    d}|j d k	r|d|j  7 }|S )Nr   z	 MATCH %s)r  r  rT   rT   rX   r    s    
z#DDLCompiler.define_constraint_matchc                 K   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)FTr  z STOREDz VIRTUAL)r   r   r  Z	persisted)r   	generatedr   r  rT   rT   rX   visit_computed_column  s      


z!DDLCompiler.visit_computed_columnc                 K   s2   d|j rdndf }| |}|r.|d| 7 }|S )NzGENERATED %s AS IDENTITYZALWAYSz
BY DEFAULTrL  )alwaysr  )r   r  r   r  r  rT   rT   rX   visit_identity_column  s    
z!DDLCompiler.visit_identity_column)NNT)F)N)FT)F)N)-r   r   r   r   rq  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  rT   rT   rT   rX   r    s`   

     
7
 
)   
 



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 )NFLOATrT   r   rT   rT   rX   visit_FLOAT  s    zGenericTypeCompiler.visit_FLOATc                 K   s   dS )NZREALrT   r   rT   rT   rX   
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  Zscaler  r   rT   rT   rX   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   rT   rT   rX   visit_DECIMAL  s    

z!GenericTypeCompiler.visit_DECIMALc                 K   s   dS )NZINTEGERrT   r   rT   rT   rX   visit_INTEGER  s    z!GenericTypeCompiler.visit_INTEGERc                 K   s   dS )NZSMALLINTrT   r   rT   rT   rX   visit_SMALLINT  s    z"GenericTypeCompiler.visit_SMALLINTc                 K   s   dS )NZBIGINTrT   r   rT   rT   rX   visit_BIGINT  s    z GenericTypeCompiler.visit_BIGINTc                 K   s   dS )N	TIMESTAMPrT   r   rT   rT   rX   visit_TIMESTAMP  s    z#GenericTypeCompiler.visit_TIMESTAMPc                 K   s   dS )NZDATETIMErT   r   rT   rT   rX   visit_DATETIME  s    z"GenericTypeCompiler.visit_DATETIMEc                 K   s   dS )NZDATErT   r   rT   rT   rX   
visit_DATE  s    zGenericTypeCompiler.visit_DATEc                 K   s   dS )NZTIMErT   r   rT   rT   rX   
visit_TIME  s    zGenericTypeCompiler.visit_TIMEc                 K   s   dS )NZCLOBrT   r   rT   rT   rX   
visit_CLOB  s    zGenericTypeCompiler.visit_CLOBc                 K   s   dS )NZNCLOBrT   r   rT   rT   rX   visit_NCLOB  s    zGenericTypeCompiler.visit_NCLOBc                 C   s0   |}|j r|d|j  7 }|jr,|d|j 7 }|S )N(%d)z COLLATE "%s")lengthr  )r   r   r   r  rT   rT   rX   _render_string_type  s    z'GenericTypeCompiler._render_string_typec                 K   s   |  |dS )NZCHARr  r   rT   rT   rX   
visit_CHAR  s    zGenericTypeCompiler.visit_CHARc                 K   s   |  |dS )NZNCHARr  r   rT   rT   rX   visit_NCHAR  s    zGenericTypeCompiler.visit_NCHARc                 K   s   |  |dS )NZVARCHARr  r   rT   rT   rX   visit_VARCHAR  s    z!GenericTypeCompiler.visit_VARCHARc                 K   s   |  |dS )NZNVARCHARr  r   rT   rT   rX   visit_NVARCHAR  s    z"GenericTypeCompiler.visit_NVARCHARc                 K   s   |  |dS )NZTEXTr  r   rT   rT   rX   
visit_TEXT  s    zGenericTypeCompiler.visit_TEXTc                 K   s   dS )NZBLOBrT   r   rT   rT   rX   
visit_BLOB  s    zGenericTypeCompiler.visit_BLOBc                 K   s   d|j rd|j  pd S )NZBINARYr  r   r  r   rT   rT   rX   visit_BINARY  s    z GenericTypeCompiler.visit_BINARYc                 K   s   d|j rd|j  pd S )NZ	VARBINARYr  r   r  r   rT   rT   rX   visit_VARBINARY  s    z#GenericTypeCompiler.visit_VARBINARYc                 K   s   dS )NZBOOLEANrT   r   rT   rT   rX   visit_BOOLEAN  s    z!GenericTypeCompiler.visit_BOOLEANc                 K   s   | j |f|S r   )r  r   rT   rT   rX   visit_large_binary  s    z&GenericTypeCompiler.visit_large_binaryc                 K   s   | j |f|S r   )r  r   rT   rT   rX   visit_boolean   s    z!GenericTypeCompiler.visit_booleanc                 K   s   | j |f|S r   )r   r   rT   rT   rX   
visit_time  s    zGenericTypeCompiler.visit_timec                 K   s   | j |f|S r   )r  r   rT   rT   rX   visit_datetime  s    z"GenericTypeCompiler.visit_datetimec                 K   s   | j |f|S r   )r  r   rT   rT   rX   
visit_date	  s    zGenericTypeCompiler.visit_datec                 K   s   | j |f|S r   )r  r   rT   rT   rX   visit_big_integer  s    z%GenericTypeCompiler.visit_big_integerc                 K   s   | j |f|S r   )r  r   rT   rT   rX   visit_small_integer  s    z'GenericTypeCompiler.visit_small_integerc                 K   s   | j |f|S r   )r  r   rT   rT   rX   visit_integer  s    z!GenericTypeCompiler.visit_integerc                 K   s   | j |f|S r   )r  r   rT   rT   rX   
visit_real  s    zGenericTypeCompiler.visit_realc                 K   s   | j |f|S r   )r  r   rT   rT   rX   visit_float  s    zGenericTypeCompiler.visit_floatc                 K   s   | j |f|S r   )r  r   rT   rT   rX   visit_numeric  s    z!GenericTypeCompiler.visit_numericc                 K   s   | j |f|S r   r	  r   rT   rT   rX   visit_string  s    z GenericTypeCompiler.visit_stringc                 K   s   | j |f|S r   r  r   rT   rT   rX   visit_unicode!  s    z!GenericTypeCompiler.visit_unicodec                 K   s   | j |f|S r   r  r   rT   rT   rX   
visit_text$  s    zGenericTypeCompiler.visit_textc                 K   s   | j |f|S r   r  r   rT   rT   rX   visit_unicode_text'  s    z&GenericTypeCompiler.visit_unicode_textc                 K   s   | j |f|S r   r  r   rT   rT   rX   
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   rT   rT   rX   r  -  s
    zGenericTypeCompiler.visit_nullc                 K   s   | j || jf|S r   )r   Ztype_enginer   r   rT   rT   rX   visit_type_decorator4  s    z(GenericTypeCompiler.visit_type_decoratorc                 K   s   |j f |S r   )get_col_specr   rT   rT   rX   visit_user_defined7  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%  rT   rT   rT   rX   r    sT   	r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )StrSQLTypeCompilerc                 K   s>   z
|j }W n" tk
r,   | j|f| Y S X || f|S d S r   )r   AttributeError_visit_unknown)r   r   r   r   rT   rT   rX   r   <  s
    
zStrSQLTypeCompiler.processc                 C   s   | dr| jS t|d S )NZvisit_)
startswithr(  r'  )r   r   rT   rT   rX   __getattr__D  s    
zStrSQLTypeCompiler.__getattr__c                 K   s(   |j j|j j kr|j jS t|S d S r   )r+  r   upperreprr   rT   rT   rX   r(  J  s    z!StrSQLTypeCompiler._visit_unknownc                 K   s   dS r  rT   r   rT   rT   rX   r  P  s    zStrSQLTypeCompiler.visit_nullc                 K   s6   z
|j }W n tk
r&   t| Y S X |f |S d S r   )r$  r'  r,  )r   r   r   r$  rT   rT   rX   r%  S  s
    
z%StrSQLTypeCompiler.visit_user_definedN)r   r   r   r   r*  r(  r  r%  rT   rT   rT   rX   r&  ;  s
   r&  c                   @   s2  e Zd ZdZeZeZeZ	e
dZd@ddZd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdAddZdBddZdd ZdCdd ZdDd!d"ZdEd#d$ZdFd%d&Zed'dGd(d)ZdHd*d+Z dId,d-Z!d.d/ Z"d0d1 Z#dJd2d3Z$d4d5 Z%dKd6d7Z&dLd8d9Z'dMd:d;Z(ej)d<d= Z*d>d? Z+dS )NIdentifierPreparerz@Handle quoting and case-folding of identifiers based on options.r	   "NTFc                 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   )r^   r]   N)
r   initial_quotefinal_quoteescape_quoteescape_to_quoteomit_schemaquote_case_sensitive_collations_stringsr   r  )r   r   r/  r0  r1  r4  r3  rT   rT   rX   r   q  s    zIdentifierPreparer.__init__c                    s2   | j | j }|j| j  fdd}||_|S )Nc                    sX   | j }| krN| jrN|d k	r:d|ks,d|kr:td| td|pDd ddS | j S d S )N[]zJSquare bracket characters ([]) not supported in schema translate name '%s'z__[SCHEMA_%s]_noneFr  )r	   Z_use_schema_mapr   r;  r   )r   r   r  rT   rX   symbol_getter  s    
 z@IdentifierPreparer._with_schema_translate.<locals>.symbol_getter)r+  __new____dict__r   r  )r   r   prepr:  rT   r  rX   r     s
    z)IdentifierPreparer._with_schema_translatec                    s4   | d  kr d   d<  fdd}t d||S )Nr8  c                    s6   |  d} | }|s,jj}|s,td|S )Nr   zLDialect has no default schema name; can't use None as dynamic schema target.)r.   r   Zdefault_schema_namer   r;  r  )r!  r   r  dr   rT   rX   r    s    
z=IdentifierPreparer._render_schema_translates.<locals>.replacez(__\[SCHEMA_([^\]]+)\]))r'  r(  )r   r~   r   r  rT   r>  rX   r     s
    z,IdentifierPreparer._render_schema_translatesc                 C   s&   | | j| j}| jr"| dd}|S )zEscape an identifier.

        Subclasses should override this to provide database-dependent
        escaping behavior.
        r  r  )r  r1  r2  r  r   r*  rT   rT   rX   _escape_identifier  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  r2  r1  r@  rT   rT   rX   _unescape_identifier  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", "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   regrT   rT   rX   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/  rA  r0  r@  rT   rT   rX   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_valuerT   rT   rX   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.)rH  r  r   rI  r@  rT   rT   rX   r&    s    z1IdentifierPreparer._requires_quotes_illegal_charsc                 C   s    |dk	rt jdd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().0.9r<  )r   r>  r  )r   r	   forcerT   rT   rX   r    s    
zIdentifierPreparer.quote_schemac                 C   s   |dk	rt jddd t|dd}|dkrp|| jkr>| j| S | |rZ| || j|< n
|| j|< | j| S n|r~| |S |S dS )a  Conditionally quote an identifier.

        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().rJ  r<  r  )r   r>  r(  r5  r  rE  )r   r  rK  rT   rT   rX   r  (  s     





zIdentifierPreparer.quotec                 C   s   | j r| |S |S d S r   )r4  r  )r   Zcollation_namerT   rT   rX   r  \  s    
z#IdentifierPreparer.format_collationc                 C   s>   |  |j}| |}| js:|r:|d k	r:| |d | }|S r  )r  r   r  r3  r  )r   r/  rF  r   r  rT   rT   rX   r  b  s    
z"IdentifierPreparer.format_sequencec                 C   s   |  |p|jS r   r  r   )r   r   r   rT   rT   rX   r  o  s    zIdentifierPreparer.format_labelc                 C   s   |  |p|jS r   rL  )r   r  r   rT   rT   rX   r  r  s    zIdentifierPreparer.format_aliasc                 C   s"   |p|j }| |r| |}|S r   )r  r  rE  )r   Z	savepointr   r  rT   rT   rX   ri  u  s    


z#IdentifierPreparer.format_savepointzsqlalchemy.sql.namingc                 C   s`   t jj}|jtjkr0|||j}|d kr6d S n|j}|jdkrN| j	||dS | j
||dS d S )Nr   )_alembic_quote)r   rv  Z
sql_namingr   r   Z
_NONE_NAMEZ_constraint_name_for_tablerK   r   truncate_and_render_index_name#truncate_and_render_constraint_name)r   r   rM  Znamingr   rT   rT   rX   r  ~  s$     
  z$IdentifierPreparer.format_constraintc                 C   s   | j jp| j j}| |||S r   )r   Zmax_index_name_lengthr    _truncate_and_render_maxlen_namer   r   rM  max_rT   rT   rX   rN    s      z1IdentifierPreparer.truncate_and_render_index_namec                 C   s   | j jp| j j}| |||S r   )r   Zmax_constraint_name_lengthr   rP  rQ  rT   rT   rX   rO    s      z6IdentifierPreparer.truncate_and_render_constraint_namec                 C   sb   t |tjr@t||krL|d|d  d t|dd   }n| j| |sT|S | |S d S )Nr      rC  )	r  r   r  r3  r   Zmd5_hexr   Zvalidate_identifierr  )r   r   rR  rM  rT   rT   rX   rP    s    (z3IdentifierPreparer._truncate_and_render_maxlen_namec                 C   s
   |  |S r   )r  r  rT   rT   rX   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  r3  r  )r   rK   rF  r   r  r  rT   rT   rX   rP    s    

zIdentifierPreparer.format_tablec                 C   s
   |  |S )zPrepare a quoted schema name.r9  r  rT   rT   rX   r    s    z IdentifierPreparer.format_schemac                 C   s(   |dk	rt |tjr||}| |S )Prepare a quoted column name.N)r  r   r  r  r  )r   r   r   rT   rT   rX   r    s    
 
z$IdentifierPreparer.format_label_namec                 C   s   |dkr|j }|dk	r,t|tjr,||}t|ddsh|r\| j|j||dd | | S | |S n"|r| j|j||dd | S |S dS )rU  Nr  F)rF  r   r  )	r   r  r   r  r  r(  rP  rK   r  )r   r   r  r   Z
table_namerF  r   rT   rT   rX   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.Fr  N)r  r3  r  rP  )r   rK   rF  r  rT   rT   rX   r  
  s    
z#IdentifierPreparer.format_table_seqc                 C   s@   dd | j | j| | jfD \}}}td|||d }|S )Nc                 S   s   g | ]}t |qS rT   )r'  r  r  rT   rT   rX   rN    s   z5IdentifierPreparer._r_identifiers.<locals>.<listcomp>zM(?:(?:%(initial)s((?:%(escaped)s|[^%(final)s])+)%(final)s|([^\.]+))(?=\.|$))+)initialfinalescaped)r/  r0  rA  r'  rp  )r   rV  rW  Zescaped_finalrrT   rT   rX   _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 rT   )rB  )rV   rX  r   rT   rX   rN  1  s   z;IdentifierPreparer.unformat_identifiers.<locals>.<listcomp>c                 S   s   g | ]\}}|p|qS rT   rT   )rV   ar   rT   rT   rX   rN  3  s     )rZ  findall)r   ZidentifiersrY  rT   r   rX   unformat_identifiers-  s    
z'IdentifierPreparer.unformat_identifiers)r.  Nr.  TF)N)N)T)N)N)N)T)T)T)TN)N)FNNFN)T),r   r   r   r   RESERVED_WORDSrF  LEGAL_CHARACTERSrH  ILLEGAL_INITIAL_CHARACTERSrG  r{  
attrgetterr  r   r   r   rA  rB  r  rE  r  r&  r  r  r  r  r  r  ri  r   rt  r  rN  rO  rP  r  rP  r  r  r  r  rq  rZ  r]  rT   rT   rT   rX   r-  \  s\   
     
$	

'
4



	


 
     
-

r-  )r   r   rr  r%  r{  r'  r   r   r   r   r   r   r   r	   r
   r   r   r  r   r   r   r   rI   r^  rp  Ir_  ZLEGAL_CHARACTERS_PLUS_SPACErangerN   r`  r  r  r  UNICODEr  r  r   r  r0  r<  r  r  or_addmulr(  divmodtruedivnegltlenegtgeeqZis_distinct_fromZis_not_distinct_fromZ	concat_oprS  Znot_match_opr[  rZ  r@  r   r  r  r  r   existsZdistinct_opinvZany_opZall_opZdesc_opZasc_opZnulls_first_opZnulls_last_opr  rf   r   r    r!   r"   r8   r9   rg   rh   rH   rP   ZcubeZrollupZgrouping_setsr*  rn  r  ry   Z	UNION_ALLrz   Z
EXCEPT_ALLr{   ZINTERSECT_ALLro  ZRM_RENDERED_NAMEZRM_NAMEZ
RM_OBJECTSZRM_TYPE
namedtupler}   symbolr   r   r   r   r   objectr   with_metaclassZEnsureKWArgTyper   ZColumnElementr   r   ru  r  r  r&  r-  rT   rT   rT   rX   <module>   s  c  
                                     ,                    
  ? #                              !e     !