
    ؄_                    l   d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 dd	lm
Z
 dd
lmZ ddlmZ ddlmZ ddlmZ  eg d          Z ej        dej                  Z ej        dej                  Zd  edd          D                                 dg          Z ej        dej                  Z ej        dej                  Z ej        dej                  Z ej        dej                  Z ej        dej                  ZddddddZi ej        dej         d ej!        d!ej"        d"ej#        d#ej$        d$ej%        d%ej&        d$ej'        d&ej(        d'ej)        d(ej*        d)ej+        d*ej,        d+ej-        d,ej.        d-ej/        d.i ej0        d/ej1        d0ej2        d1ej3        d2ej4        d3ej5        d4ej6        d5ej7        d6ej8        d7ej9        d8ej:        d9ej;        d:ej<        d;ej=        d<ej>        d=ej?        d>ej@        d?ejA        d@ejB        dAejC        dBiZDejE        dCejF        dDejG        dEejH        dFejI        dGejJ        dHejK        dIejL        dJejM        dKejN        dLejO        dMejP        dNejQ        dOejR        dPiZSdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`ZTe
jU        jV        dae
jU        jW        dbe
jU        jX        dce
jU        jY        dde
jU        jZ        dee
jU        j[        dfiZ\ G dg dhe]          Z^ G di dj ej_        ej`        e]                    Za G dk dlejb                  Zc G dm dned          Ze G do dpe^          Zf G dq dref          Zg G ds dte^          Zh G du dvea          Zi G dw dxei          Zj G dy dze]          ZkdS ){a]  Base SQL and DDL compiler implementations.

Classes provided include:

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

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

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

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

    N   )crud)elements)	functions)	operators)schema)
selectable)sqltypes)visitors   )exc)util)^allanalyseanalyzeandanyarrayasasc
asymmetricauthorizationbetweenbinarybothcasecastcheckcollatecolumn
constraintcreatecrosscurrent_datecurrent_rolecurrent_timecurrent_timestampcurrent_userdefault
deferrabledescdistinctdoelseendexceptfalseforforeignfreezefromfullgrantgrouphavingilikein	initiallyinner	intersectintoisisnulljoinleadingleftlikelimit	localtimelocaltimestampnaturalnewnotnotnullnulloffoffsetoldononlyororderouteroverlapsplacingprimary
referencesrightselectsession_usersetsimilarsome	symmetrictablethentotrailingtrueunionuniqueuserusingverbosewhenwherez^[A-Z0-9_$]+$z^[A-Z0-9_ $]+$c                 ,    h | ]}t          |          S  )str).0xs     \/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/sql/compiler.py	<setcomp>rs      s    ;;;c!ff;;;    
   $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)pyformatqmarkformatnumericnamed 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 ,  FROM  AS  IS z IS NOT z	 COLLATE zEXISTS 	DISTINCT zNOT zANY zALL z DESCz ASCz NULLS FIRSTz NULLS LASTcoalesceCURRENT_DATECURRENT_TIMECURRENT_TIMESTAMPCURRENT_USER	LOCALTIMELOCALTIMESTAMPrandomsysdateSESSION_USERUSERCUBEROLLUPzGROUPING SETSmonthdayyearsecondhourdoyminutequarterdowweekepochmillisecondsmicrosecondstimezone_hourtimezone_minute)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   UNIONz	UNION ALLEXCEPTz
EXCEPT ALL	INTERSECTzINTERSECT ALLc                       e Zd ZdZdZdZ ej                    Z	 dd ej                    fdZ	 ej
        dd          d             Zd Zed             Zd	 Zd
 ZddZed             Zd Zd ZdS )Compileda  Represent a compiled SQL or DDL expression.

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

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

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

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

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

         .. versionadded:: 1.1

         .. seealso::

            :ref:`schema_translating`

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


        N)dialectbindidentifier_preparerpreparerschema_translate_map_with_schema_translate	statementsupports_executioncan_execute_execution_optionsexecution_optionsprocessstring)selfr   r   r   r   compile_kwargss         rr   __init__zCompiled.__init__  s    @ 	8$8! 	 M@@$ DM  &DN(;D F)2)E&&$,t~HHHHDKKK ! rt   z0.7zThe :meth:`.Compiled.compile` method is deprecated and will be removed in a future release.   The :class:`.Compiled` object now runs its compilation within the constructor, and this method does nothing.c                     dS )z;Produce the internal string representation of this element.Nrn   r   s    rr   compilezCompiled.compileD  s	     	rt   c                 p    | j         r|                    | ||          S t          j        | j                  N)r   _execute_compiledr   ObjectNotExecutableErrorr   )r   
connectionmultiparamsparamss       rr   _execute_on_connectionzCompiled._execute_on_connectionO  s8     	?//k6JJJ.t~>>>rt   c                     t                      )zReturn a Compiled that is capable of processing SQL expressions.

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

        NotImplementedErrorr   s    rr   sql_compilerzCompiled.sql_compilerU       "###rt   c                      |j         | fi |S r   _compiler_dispatch)r   objkwargss      rr   r   zCompiled.process_  s    %s%d55f555rt   c                     | j         pdS )z3Return the string text of the generated SQL or DDL. )r   r   s    rr   __str__zCompiled.__str__b  s     { b rt   c                     t                      )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.
        r   r   r   s     rr   construct_paramszCompiled.construct_paramsg  r   rt   c                 *    |                                  S )z0Return the bind params for this compiled object.r   r   s    rr   r   zCompiled.paramsq  s     $$&&&rt   c                 n    | j         }|t          j        dd          |                    | ||          S )zExecute this compiled object.Nz>This Compiled object is not bound to any Engine or Connection.2aficode)r   r   UnboundExecutionErrorr   )r   r   r   es       rr   executezCompiled.executev  sL     I9+!   
 ""4f===rt   c                 @     | j         |i |                                S )zJExecute this compiled object and return the result's
        scalar value.)r   scalar)r   r   r   s      rr   r   zCompiled.scalar  s'     t|[3F33::<<<rt   r   )__name__
__module____qualname____doc___cached_metadatar   r   immutabledictr   r   
deprecatedr   r   propertyr   r   r   r   r   r   r   rn   rt   rr   r   r      s:       
 
 **,, !)t)++.I .I .I .I` T_	   ? ? ? $ $ X$6 6 6! ! !
$ $ $ $ ' ' X'
> 
> 
>= = = = =rt   r   c                   "    e Zd ZdZdZd Zd ZdS )TypeCompilerz2Produces DDL specification for TypeEngine objects.z	visit_\w+c                     || _         d S r   )r   )r   r   s     rr   r   zTypeCompiler.__init__  s    rt   c                      |j         | fi |S r   r   r   type_kws      rr   r   zTypeCompiler.process  s    'u'33333rt   N)r   r   r   r   ensure_kwargr   r   rn   rt   rr   r   r     s=        <<L  4 4 4 4 4rt   r   c                   T    e Zd ZdZdZdZd
dZed             Zed             Z	d Z
d	S )_CompileLabelz;lightweight label object which acts as an expression.Label.label)elementnamern   c                 8    || _         || _        |f|z   | _        d S r   )r   r   
_alt_names)r   colr   	alt_namess       rr   r   z_CompileLabel.__init__  s"    	&9,rt   c                     | j         j        S r   )r   	proxy_setr   s    rr   r   z_CompileLabel.proxy_set  s    |%%rt   c                     | j         j        S r   )r   typer   s    rr   r   z_CompileLabel.type  s    |  rt   c                     | S r   rn   )r   r   s     rr   
self_groupz_CompileLabel.self_group  s    rt   N)rn   )r   r   r   r   __visit_name__	__slots__r   r   r   r   r   rn   rt   rr   r   r     s}        EEN!I- - - -
 & & X& ! ! X!    rt   r   c                       e Zd ZdZd ZdS )prefix_anon_mapac  A map that creates new keys for missing key access.
    Considers keys of the form "<ident> <name>" to produce
    new symbols "<name>_<index>", where "index" is an incrementing integer
    corresponding to <name>.
    Inlines the approach taken by :class:`sqlalchemy.util.PopulateDict` which
    is otherwise usually used for this type of operation.
    c                     |                     dd          \  }}|                     |d          }|dz   | |<   |dz   t          |          z   }|| |<   |S )N r   _)splitgetro   )r   keyidentderivedanonymous_countervalues         rr   __missing__zprefix_anon_map.__missing__  sa    99S!,, HHWa00)A-W#$5 6 66S	rt   N)r   r   r   r   r
  rn   rt   rr   r   r     s-             rt   r   c                      e Zd ZdZeZeZdxZxZ	Z
	 dZdZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dZ	 dxZZ	 ddZed             Zej        d             Zej        d	             Zd
 Z ej!        d             Z"d Z#ed             Z$ddZ%ed             Z& ej'        d          d             Z(d Z)ddZ*	 ddZ+	 ddZ,	 	 	 	 ddZ-d Z.	 ddZ/d Z0d Z1d Z2d Z3d Z4d Z5d Z6	 dd Z7d! Z8d" Z9d# Z:d$ Z;d% Z<d& Z=d' Z>d( Z?d) Z@d* ZAd+ ZBd, ZCdd-ZDd. ZEd/ ZFd0 ZG	 dd2ZHd3 ZId4 ZJd5 ZKd6 ZLd7 ZMd8 ZNd9 ZOd: ZPd; ZQ	 dd<ZRd= ZSd> ZTd? ZUd@ ZVdA ZW	 ddBZXdC ZYdD ZZej!        dE             Z[dF Z\dG Z]dH Z^dI Z_dJ Z`dK ZadL ZbdM ZcdN ZddO ZedP ZfdQ Zg	 	 	 ddRZhdS ZidT ZjdU ZkdV ZldW Zm	 ddXZn	 	 	 	 ddYZo	 	 	 	 ddZZpd[ Zqdd\Zrd] Zsd^ Zt	 	 	 dd_Zud` Zvda Zwdb Zxdc Zydd Zzde Z{df Z| ej}        dg e~            fdh e~            fg          ZddiZ	 	 	 	 	 	 	 ddjZdk Zdl Zdm Zdn Zdo Zdp Zdq Zdr Zds Zdt Zdu Zdv Z	 	 	 	 	 ddwZddxZdy ZddzZd{ Zd| Zd} Zdd~Zej!        d             Zd Zd ZddZd Zd Zd ZdS )SQLCompilerz~Default implementation of :class:`.Compiled`.

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

    FNTrn   c                 L   || _         |pt          |dd          | _        i | _        t	          j                    | _        g | _        g | _        |j	        | _	        | j	        rg | _
        |j        dk    | _        t          |j                 | _        d| _        |j        p|j        | _        t%                      | _        i | _        t+          j        | ||fi | | j        s| j        s| j        r|j        r|j        | _        | j	        r| j        r|                                  dS dS dS )a  Construct a new :class:`.SQLCompiler` object.

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

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

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

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

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

        inlineFr{   N)column_keysgetattrr  bindsr   column_dict
bind_namesstack_result_columns
positionalpositiontup
paramstyle_numeric_bindsBIND_TEMPLATESbindtemplatecteslabel_lengthmax_identifier_lengthr   anon_maptruncated_namesr   r   isinsertisupdateisdelete
_returning	returning_apply_numbered_params)r   r   r   r  r  r   s         rr   r   zSQLCompiler.__init__  s_   & ' C	8U C C 
 *,, 
  " ",? 	B!D")"4	"AD*7+=>	  AG$A 	 ())  "$==f=== M	2!]	2.2m	2"	2 '1DN? 	*t2 	*'')))))	* 	* 	* 	*rt   c                 :    t          | j        | j        z             S r   )listinsert_prefetchupdate_prefetchr   s    rr   prefetchzSQLCompiler.prefetchZ  s    D(4+??@@@rt   c                 r    t          j                    | _        i | _        d| _        | j        r	i | _        dS dS )zInitialize collections related to CTEs only if
        a CTE is located, to save on the overhead of
        these collections otherwise.

        FN)r   OrderedDictr  ctes_by_namectes_recursiver  cte_positionalr   s    rr   _init_cte_statezSQLCompiler._init_cte_state^  sF     $&&	#? 	%"$D	% 	%rt   c              #   @  K   | j         | j        }}g dc| _         | _        	 | j        r| j        d         }d|d<   nd}| j         | j        fV  |r|                    d           ||c| _         | _        dS # |r|                    d           ||c| _         | _        w xY w)z;special API to support the use case of 'nested result sets'FTneed_result_map_for_nestedN)r  _ordered_columnsr  pop)r   result_columnsordered_columnsentrys       rr   _nested_resultzSQLCompiler._nested_resultl  s        ! ( 79%3d3	z 
26:233&(===== 8		6777 8D $"7"7"7  8		6777 8D $"7    s   ,A5 5(Bc                 v    t          j        d          t          j        dfd| j                  | _        d S )Nr   z\[_POSITION\]c                 F    t          t          j                            S r   )ro   r   next)mposcounts    rr   <lambda>z4SQLCompiler._apply_numbered_params.<locals>.<lambda>  s    DIh,?,?(@(@ rt   )	itertoolscountresubr   )r   r?  s    @rr   r&  z"SQLCompiler._apply_numbered_params  s<    ?1%%f@@@@$+
 
rt   c                 X     t          d  fd j        D             D                       S )Nc              3   (   K   | ]\  }}|||fV  d S r   rn   )rp   r  r	  s      rr   	<genexpr>z/SQLCompiler._bind_processors.<locals>.<genexpr>  s@       

 

U   %L !   

 

rt   c              3   p   K   | ]0}j         |         |j                            j                  fV  1d S r   )r  r   _cached_bind_processorr   )rp   	bindparamr   s     rr   rG  z/SQLCompiler._bind_processors.<locals>.<genexpr>  sZ        
  OI.N99$,GG     rt   )dictr  r   s   `rr   _bind_processorszSQLCompiler._bind_processors  sX     

 

   
 "&  

 

 

 

 

 
	
rt   c                 2    t          | j                  dk    S Nr   )lenr  r   s    rr   is_subqueryzSQLCompiler.is_subquery  s    4:""rt   c                     | S r   rn   r   s    rr   r   zSQLCompiler.sql_compiler  s    rt   c                 l   |ri }| j         D ]}| j         |         }|j        |v r||j                 ||<   )||v r||         ||<   9|rG|j        r@|r t          j        d|j        |fz  d          t          j        d|j        z  d          |j        r|j        ||<   |j        ||<   |S i }| j         D ]}}|rG|j        r@|r t          j        d|j        |fz  d          t          j        d|j        z  d          |j        r|j        || j         |         <   h|j        || j         |         <   ~|S )z5return a dictionary of bind parameter keys and valuesz@A value is required for bind parameter %r, in parameter group %dcd3xr   z)A value is required for bind parameter %r)r  r  requiredr   InvalidRequestErrorcallableeffective_valuer	  )r   r   _group_number_checkpdrJ  r   s          rr   r   zSQLCompiler.construct_params  s     3	B!_ / /	y1=F**%im4BtHHV^^%d|BtHH /	 2 /$ !54(}m<= "(	    "5G'm,!'    ' /(8BtHH(BtHHIB!_ E E	 i0 $ !54(}m<= "(	    "5G'm,!'    % E5>5NBty1225>_Bty122Irt   c                 .    |                      d          S )zoReturn the bind param dictionary embedded into this
        compiled object, for those values that are present.F)rY  r   r   s    rr   r   zSQLCompiler.params  s     $$E$222rt   zsqlalchemy.engine.resultc                 @    |j                             | j                  S )z(utility method used for unit tests only.)ResultMetaData_create_result_mapr  )r   results     rr   r^  zSQLCompiler._create_result_map  s     $778LMMMrt   c                     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   rn   r   s    rr   default_fromzSQLCompiler.default_from  s	     rrt   c                 4    d |j         j        | fi |z   dz   S )N()r   r   )r   groupingasfromr   s       rr   visit_groupingzSQLCompiler.visit_grouping  s+    8X%8HHHHH3NNrt   c                 (   | j         rw| j        j        rk| j         d         d         }|j        \  }}}|r|}n|}|j        j        }	|	8|	j        |v r/|	                    ||	j                           r|j        j        |d<    | j        |j        fd|i|S )Nr3  r	   render_label_as_labelwithin_columns_clause)	r  r   supports_simple_order_by_label_label_resolve_dictr   _order_by_label_elementr   shares_lineager   )
r   r   rk  r   r	   	with_cols
only_froms	only_colsresolve_dictorder_by_elems
             rr   visit_label_referencez!SQLCompiler.visit_label_reference  s     : 	<$,E 	<B5J/9/M,Iz9$ ))( $OCM )!&,66!00 !34  7 O; + t|O
 
"7
 
 
 	
rt   c                 d   | j         s|                     |j                  S | j         d         d         }|j        \  }}}	 |r||j                 }n||j                 }||d<    | j        |fd|i|S # t
          $ r2}	t          j        |j        t          j	        d|	           Y d }	~	d S d }	~	ww xY w)Nr3  r	   rj  rk  zECan't resolve label reference for ORDER BY / GROUP BY / DISTINCT etc.)err)
r  r   _text_clauserm  r   KeyErrorr   _no_text_coercionr   CompileError)
r   r   rk  r   r	   rp  rq  rr  r   kes
             rr   visit_textual_label_referencez)SQLCompiler.visit_textual_label_reference  s    z 	6<< 4555Z^L1
+5+I(	:y	$ 1 10 /2F*+4< +@DJ    	 	 	& +         	s   A3 3
B/='B**B/c                    |o| }||u }|s|rBt          |j        t          j                  r|                     d|j                  }	n|j        }	|rn|" ||	|j        ||	f|j        z   |j                    |j        j        | fddd|t          t          j                 z   | j                            ||	          z   S |r| j                            ||	          S  |j        j        | fddi|S )NcolidentT)rk  within_label_clauserk  F)
isinstancer   r   _truncated_label_truncated_identifierr   r   r   r   	OPERATORSr   as_r   format_label)
r   r   add_to_result_mapr  rk  rj  r   render_label_with_asrender_label_only	labelnames
             rr   visit_labelzSQLCompiler.visit_label,  sa    "=*=&= 	 2U: 	' 4 	'%*h&?@@ ' 66z5:NN		!J	 	 ,!!JI&)99J	   10*.(,  	  IM*+ -,,UI>>?	  	=--eY???35=3 ,157  rt   c                 *    t          j        d          )Nz:Cannot compile Column object until its 'name' is assigned.r   r{  r   r    s     rr   _fallback_column_namez!SQLCompiler._fallback_column_name]  s    K
 
 	
rt   c                    |j         x}}||                     |          }|j        }|s0t          |t          j                  r|                     d|          }| ||||||j        f|j                   |r| 	                    |          }n| j
                            |          }|j        }|	|r|j        s|S | j
                            |          }	|	r| j
                            |	          dz   }
nd}
|j         }t          |t          j                  r|                     d|          }|
| j
                            |          z   dz   |z   S )Nr  .r   alias)r   r  
is_literalr  r   r  r  r  r   escape_literal_columnr   quotera   named_with_columnschema_for_objectquote_schema)r   r    r  include_tabler   r   	orig_namer  ra   effective_schemaschema_prefix	tablenames               rr   visit_columnzSQLCompiler.visit_columnb  s    ";&y<--f55D&
 	@jx/HII 	@--j$??D(i&$
!;V[    	- --d33DD=&&t,,D==U5L=K#}>>uEE #M../?@@3F  !#
I)X%>?? K 66w	JJ	 4=#6#6y#A#AACG$NNrt   c                 @    | j                             |j                  S r   )r   format_collation	collation)r   r   r   s      rr   visit_collationzSQLCompiler.visit_collation  s    }--g.?@@@rt   c                     |j         S r   r   )r   
fromclauser   s      rr   visit_fromclausezSQLCompiler.visit_fromclause  s
    rt   c                     |j         S r   r  )r   indexr   s      rr   visit_indexzSQLCompiler.visit_index  s
    zrt   c                 F    ||d<    | j         j        j        |j        fi |S )Ntype_expression)r   type_compilerr   r   )r   
typeclauser   s      rr   visit_typeclausezSQLCompiler.visit_typeclause  s/     *1t|)1*/HHRHHHrt   c                 J    | j         j        r|                    dd          }|S N%%%r   _double_percentsreplacer   texts     rr   post_process_textzSQLCompiler.post_process_text  '    =) 	+<<T**Drt   c                 J    | j         j        r|                    dd          }|S r  r  r  s     rr   r  z!SQLCompiler.escape_literal_column  r  rt   c           	            fd} j         sd _        t                              d t                              |                     j                                      S )Nc                     |                      d          }|j        v r j        j        |         fi S  j        |fi S rN  )r8   _bindparamsr   bindparam_string)r>  r   r   r   
textclauses     rr   do_bindparamz2SQLCompiler.visit_textclause.<locals>.do_bindparam  s]    771::Dz---#t|J$:4$@GGBGGG,t,T88R888rt   Tc                 ,    |                      d          S rN  )r8   )r>  s    rr   r@  z.SQLCompiler.visit_textclause.<locals>.<lambda>  s    aggajj rt   )r  isplaintextBIND_PARAMS_ESCrD  BIND_PARAMSr  r  )r   r  r   r  s   ``` rr   visit_textclausezSQLCompiler.visit_textclause  s    	9 	9 	9 	9 	9 	9 	9 z 	$#D ""  OOd44Z_EE 
 
 	
rt   c                 Z   | j          }|r| j        n| j         d         }|p1|dk    o|                    dd          p|                    dd          }|r:|j        x| _        | _        |j        D ]}	|                     |	d| j                     | j        |j	        fi |}
|r|rd|
z  }
|
S )	Nr3  r   need_result_map_for_compoundFr4  Trk  r  (%s))
r  _default_stack_entryr  r  r5  _textual_ordered_columnscolumn_argsr   _add_to_result_mapr   )r   tafcompound_indexrg  parensr   toplevelr9  populate_result_mapcr  s              rr   visit_text_as_fromzSQLCompiler.visit_text_as_from  s    z>-5I))4:b>  >!# EII<eDD>
 yy5u== 	  		 D!-_  *.&*&=      t|CK..2.. 	!f 	!D=Drt   c                     dS )NNULLrn   r   exprr   s      rr   
visit_nullzSQLCompiler.visit_null      vrt   c                 "    | j         j        rdS dS )Nre   1r   supports_native_booleanr  s      rr   
visit_truezSQLCompiler.visit_true  s    </ 	63rt   c                 "    | j         j        rdS dS )Nr1   0r  r  s      rr   visit_falsezSQLCompiler.visit_false  s    </ 	73rt   c                      |j         }|d}nt          |j                  }|                    d  fd|j        D             D                       }|j        r j        j        rd|z   }|S )Nr  c              3      K   | ]}||V  	d S r   rn   rp   ss     rr   rG  z/SQLCompiler.visit_clauselist.<locals>.<genexpr>  s>       
 
 

 
 
 
 
 
rt   c              3   4   K   | ]} |j         fi V  d S r   r   )rp   r  r   r   s     rr   rG  z/SQLCompiler.visit_clauselist.<locals>.<genexpr>  sJ        56$$T00R00     rt   zVALUES )operatorr  rB   clauses_tuple_valuesr   tuple_in_values)r   
clauselistr   sepr  s   ` `  rr   visit_clauselistzSQLCompiler.visit_clauselist  s    !;CCJ/0Cxx 
 
    :D:L  
 
 
 
 
 # 	$(D 	$t#Drt   c                    d}|j         | |j         j        | fi |dz   z  }|j        D ].\  }}|d |j        | fi |z   dz    |j        | fi |z   dz   z  }/|j        |d |j        j        | fi |z   dz   z  }|dz  }|S )NzCASE r  zWHEN z THEN zELSE END)r	  r   whenselse_)r   clauser   rq   condr_  s         rr   
visit_casezSQLCompiler.visit_case  s    <#00@@@@3FFA"L 	 	LD&)$)$99&99: ,&+D;;F;;< 	AA <#9&,9$II&IIICOA 	
U
rt   c                 (     |j         j        | fi |S r   )typed_expressionr   )r   type_coercer   s      rr   visit_type_coercezSQLCompiler.visit_type_coerce  s     >{+>tJJrJJJrt   c                 X    d |j         j        | fi |d |j        j        | fi |dS )NzCAST(r   rd  )r  r   r  )r   r   r   s      rr   
visit_castzSQLCompiler.visit_cast  sN     *DK*4::6::::.DO.t>>v>>>>
 	
rt   c           
      d   |d         t           j        u rdn|d         t           j        u rdnj|d         dk     r6 | j        t          j        t          |d                             fi |dn( | j        t          j        |d                   fi |dd|d         t           j        u rdn|d         t           j        u rdnj|d         dk     r6 | j        t          j        t          |d                             fi |dn( | j        t          j        |d                   fi |dS )	Nr   zUNBOUNDED PRECEDINGzCURRENT ROWz
 PRECEDINGz
 FOLLOWINGr}   r   zUNBOUNDED FOLLOWING)r   RANGE_UNBOUNDEDRANGE_CURRENTr   literalabs)r   range_r   s      rr   _format_frame_clausez SQLCompiler._format_frame_clause  s    ayH444 "! ayH222  ay1}} t|H,S^^<<CCCCCCF F t|H,VAY77>>2>>>>AA A ayH444 "! ayH222  ay1}} t|H,S^^<<CCCCCCF F t|H,VAY77>>2>>>>AA
 	
rt   c                 $    |j         rd  j        |j         fi z  }n |j        rd  j        |j        fi z  }nd } |j        j         fi dd                     fdd|j        fd|j        ffD             |r|gng z             dS )	NzRANGE BETWEEN %szROWS BETWEEN %sz OVER (r  c           	      ^    g | ])\  }}|t          |          |d |j        fi *S )Nz BY )rO  r   )rp   wordr  r   r   s      rr   
<listcomp>z*SQLCompiler.visit_over.<locals>.<listcomp>7  sc        %f )c&kk) tt6V6tFFvFFFH *))rt   	PARTITIONORDERrd  )r  r  rowsr   r   rB   partition_byorder_by)r   overr   r  s   ` ` rr   
visit_overzSQLCompiler.visit_over(  s!   ; 		'*C$*C+ +%+ + FF Y 	&)B)B	* *#* * FF F ,DL+D;;F;;;;HH     %d&78 $-0)    &-F882	/   
 	
rt   c                 V     |j         j        | fi |d |j        j        | fi |dS )Nz WITHIN GROUP (ORDER BY rd  )r   r   r  )r   withingroupr   s      rr   visit_withingroupzSQLCompiler.visit_withingroupD  sN    2K24BB6BBBB3K 3DCCFCCCC
 	
rt   c                 V     |j         j        | fi |d |j        j        | fi |dS )Nz FILTER (WHERE rd  )funcr   	criterion)r   
funcfilterr   s      rr   visit_funcfilterzSQLCompiler.visit_funcfilterJ  sM    .JO.t>>v>>>>3J 3DCCFCCCC
 	
rt   c                     | j                             |j        |j                  }d|d |j        j        | fi |dS )NzEXTRACT(r   rd  )extract_mapr  fieldr  r   )r   extractr   r  s       rr   visit_extractzSQLCompiler.visit_extractP  sQ     $$W]GMBBEE+GL+D;;F;;;;
 	
rt   c                 >    | ||j         |j         d|j                   t           d|j                                         z  d           }|r	 ||fi |S t                              |j        d           r|j        rdz  n\|j          j        	                              st          t          j                  r j                                      ndz   d                     fd|j        D             gz             d  j        |fi |iz  S )Nrn   zvisit_%s_funcz%(expr)sr  c                     g | ]R}j                             |          st          t          j                  rj                             |          n|SS rn   )r   _requires_quotes_illegal_charsr  r   quoted_namer  )rp   tokr   r   s     rr   r  z.SQLCompiler.visit_function.<locals>.<listcomp>m  so        	  =GGLL!%dH,@AA!++C000 !  rt   r  )r   r   r  lower	FUNCTIONSr  	__class__	_has_argsr   r  r  r   r  r  rB   packagenamesfunction_argspec)r   r  r  r   dispr   s   `    @rr   visit_functionzSQLCompiler.visit_functionW  sv   (diB	BBBt_ty/@/@@$GG 	@4'''''==66D )> 'J&Dy }CCDII!$(<==DM''--- 	  j(88      $0   &	  ..t>>v>>?@ @rt   c                 6    |                      |j                  S r   )visit_sequencesequence)r   
next_valuer   s      rr   visit_next_value_funcz!SQLCompiler.visit_next_value_funcy  s    "":#6777rt   c                 :    t          d| j        j        z            )Nz2Dialect '%s' does not support sequence increments.r   r   r   )r   r*  r   s      rr   r)  zSQLCompiler.visit_sequence|  s$    !@l 
 
 	
rt   c                 (     |j         j        | fi |S r   )clause_exprr   )r   r  r   s      rr   r%  zSQLCompiler.function_argspec  s     2t24BB6BBBrt   r   c           
           j          }|r j        n j         d         }|p|dk    o|                    dd          } j                             |d         |d         ||d            j                            |j                  }	d|	z   dz                        fd	t          |j                  D                       }
|
  j	        |fi t          dd
iz  }
|
  j        |fi z  }
|
|j        d us	|j        d ur  j        |fi pdz  }
 j        r|r                                 |
z   }
 j                             d           r
|rd|
z   dz   S |
S )Nr3  r   r  Fcorrelate_fromsasfrom_froms)r2  r3  r	   r  r  c              3   B   K   | ]\  }} |j         fd |dV  dS )F)rg  r  r  Nr   )rp   ir  rg  r   r   s      rr   rG  z4SQLCompiler.visit_compound_select.<locals>.<genexpr>  sl       	 	 Aq %$! #$	 
  	 	 	 	 	 	rt   rg  r   rc  rd  rn   )r  r  r  appendcompound_keywordskeywordrB   	enumerateselectsgroup_by_clauserK  order_by_clause_limit_clause_offset_clauselimit_clauser  _render_cte_clauser6  )r   csrg  r  r  r   r  r9  need_result_mapr8  r  s   ` `  `     rr   visit_compound_selectz!SQLCompiler.visit_compound_select  s    z>-5I))4:b>" 
a A		8%@@ 	
 	
#():#; %n 5 0?	 	
 	
 	
 (,,RZ88g#))	 	 	 	 	 	 &bj11	 	 	
 
 	$$RII4+H+Hv+H+H+HIII$$R226222T)JR->d-J 0!!"////	
 9 	4 	4**,,t3D
r 	f 	:##Krt   c                 P    d|j         d||rd|z   nd}t          | |d           S )Nvisit_r  r   )r   r  )r   	operator_
qualifier1
qualifier2attrnames        rr   _get_operator_dispatchz"SQLCompiler._get_operator_dispatch  sE     J *2C*2

 tXt,,,rt   c                    |j         rg|j        rt          j        d          |                     |j         dd          }|r |||j         fi |S  | j        |t          |j                  fi |S |j        rL|                     |j        dd          }|r |||j        fi |S  | j        |t          |j                 fi |S t          j        d          )NzFUnary expression does not support operator and modifier simultaneouslyunaryr  modifierz,Unary expression has no operator or modifier)r  rM  r   r{  rJ   _generate_generic_unary_operatorr   _generate_generic_unary_modifier)r   rL  r   r&  s       rr   visit_unaryzSQLCompiler.visit_unary  s@   > 	~ &2   .. D  tE5>88R888<t<9U^4 8:   ^ 	.. D  tE5>88R888<t<9U^4 8:   ">  rt   c                 z    |j         s| j        j        r | j        |j        fi |S d | j        |j        fi |z  S )Nz%s = 1_is_implicitly_booleanr   r  r   r   r   r   r  r   s       rr   visit_istrue_unary_operatorz'SQLCompiler.visit_istrue_unary_operator  s[    *	B|3	B  4<662666ldl7?AAbAAAArt   c                     |j         s| j        j        rd | j        |j        fi |z  S d | j        |j        fi |z  S )NNOT %sz%s = 0rR  rT  s       rr   visit_isfalse_unary_operatorz(SQLCompiler.visit_isfalse_unary_operator  s`    *	B|3	B ldl7?AAbAAAAldl7?AAbAAAArt   c                 J    d|                      |t          j                  z  S )NrW  )override_operator)visit_binaryr   match_opr   r   r  r   s       rr   visit_notmatch_op_binaryz$SQLCompiler.visit_notmatch_op_binary  s.    $++i&8 , 
 
 
 	
rt   c                 .    t          j        d           d S )NzThe IN-predicate was invoked with an empty sequence. This results in a contradiction, which nonetheless can be expensive to evaluate.  Consider alternative strategies for improved performance.)r   warnr   s    rr   _emit_empty_in_warningz"SQLCompiler._emit_empty_in_warning  s%    	3	
 	
 	
 	
 	
rt   c                     | j         j        rdS | j         j        r|                                  |                     |j        |j        k              S )Nz1 != 1r   _use_static_in_warn_on_empty_inra  r   rD   r]  s       rr   visit_empty_in_op_binaryz$SQLCompiler.visit_empty_in_op_binary  sN    <& 	<8|- .++---<<v{ :;;;rt   c                     | j         j        rdS | j         j        r|                                  |                     |j        |j        k              S )Nz1 = 1rc  r]  s       rr   visit_empty_notin_op_binaryz'SQLCompiler.visit_empty_notin_op_binary  sN    <& 	<7|- .++---<<v{ :;;;rt   c                 :    t          d| j        j        z            )Nz3Dialect '%s' does not support empty set expression.r.  )r   element_typess     rr   visit_empty_set_exprz SQLCompiler.visit_empty_set_expr  s$    !Al 
 
 	
rt   c                    | j         rCt          |j        t          j                  r$t          |j        t          j                  rd|d<   |p|j        }|                     |dd           }|r
 |||fi |S 	 t          |         } | j	        ||fi |S # t          $ r4}t          j        t          j        | |          |           Y d }~d S d }~ww xY w)NTliteral_bindsr   )replace_context)ansi_bind_rulesr  rD   r   BindParameterrZ   r  rJ  r  _generate_generic_binaryry  r   raise_r   UnsupportedCompilationError)	r   r   rZ  eager_groupingr   rF  r&  opstringrw  s	            rr   r[  zSQLCompiler.visit_binary  s+     	'6;(>??	' 6<)?@@	'
 #'B%8	**9hEE 	M4	00R000M$Y/ 5t4VXLLLLL    3D)DD$'         s   8B 
C)CCc                 (     | j         |j        fi |S r   )r   sql_functionrT  s       rr   &visit_function_as_comparison_op_binaryz2SQLCompiler.visit_function_as_comparison_op_binary0  s    t|G077B777rt   c                     | j         j        r* | j        |j        fi |dz    | j        |j        fi |z   S  | j        |j        fi |dz    | j        |j        fi |z   S )Nz %% r~   )r   r  r   rD   rZ   r]  s       rr   visit_mod_binaryzSQLCompiler.visit_mod_binary3  s    =) 	V[//B//$,v|22r223 V[//B//$,v|22r223rt   c                 J    |j         |d<    | j        |d|j        z   dz   fi |S )Nrt  r  )rt  rq  ru  rT  s       rr   visit_custom_op_binaryz"SQLCompiler.visit_custom_op_binaryA  sF    '6,t,S8,,s2
 
68
 
 	
rt   c                 0     | j         ||j        dz   fi |S Nr  )rN  ru  rT  s       rr   visit_custom_op_unary_operatorz*SQLCompiler.visit_custom_op_unary_operatorG  s3    4t4X&,
 
02
 
 	
rt   c                 0     | j         |d|j        z   fi |S r~  )rO  ru  rT  s       rr   visit_custom_op_unary_modifierz*SQLCompiler.visit_custom_op_unary_modifierL  s3    4t4S8,,
 
02
 
 	
rt   c                     |                     dd          }d|d<    |j        j        | fd|i||z    |j        j        | fd|i|z   }|r|rd|z  }|S )N
_in_binaryFTrt  r  )r  rD   r   rZ   )r   r   ru  rt  r   r  r  s          rr   rq  z$SQLCompiler._generate_generic_binaryQ  s     VVL%00
<*FK* %379   .fl- %379 	 	  	!. 	!D=Drt   c                 .    | |j         j        | fi |z   S r   re  r   rL  ru  r   s       rr   rN  z,SQLCompiler._generate_generic_unary_operatorf  s%    :%-:4FF2FFFFrt   c                 .     |j         j        | fi ||z   S r   re  r  s       rr   rO  z,SQLCompiler._generate_generic_unary_modifieri  s$    /u}/;;;;hFFrt   c                 B    t          j        dt          j                  S )Nz'%')r   )r   literal_columnr
   
STRINGTYPEr   s    rr   _like_percent_literalz!SQLCompiler._like_percent_literall  s    &uH4GHHHHrt   c                     |                                 }| j        }|                    |j                                      |          |_         | j        ||fi |S r   _cloner  __add__rZ   visit_like_op_binaryr   r   r  r   percents        rr   visit_contains_op_binaryz$SQLCompiler.visit_contains_op_binaryp  sW    ,v|44<<WEE(t(@@R@@@rt   c                     |                                 }| j        }|                    |j                                      |          |_         | j        ||fi |S r   r  r  r  rZ   visit_notlike_op_binaryr  s        rr   visit_notcontains_op_binaryz'SQLCompiler.visit_notcontains_op_binaryv  sW    ,v|44<<WEE+t+FHCCCCCrt   c                     |                                 }| j        }|                    |j                  |_         | j        ||fi |S r   )r  r  __radd__rZ   r  r  s        rr   visit_startswith_op_binaryz&SQLCompiler.visit_startswith_op_binary|  sK    ,''55(t(@@R@@@rt   c                     |                                 }| j        }|                    |j                  |_         | j        ||fi |S r   )r  r  r  rZ   r  r  s        rr   visit_notstartswith_op_binaryz)SQLCompiler.visit_notstartswith_op_binary  sK    ,''55+t+FHCCCCCrt   c                     |                                 }| j        }|                    |j                  |_         | j        ||fi |S r   r  r  s        rr   visit_endswith_op_binaryz$SQLCompiler.visit_endswith_op_binary  sI    ,v|44(t(@@R@@@rt   c                     |                                 }| j        }|                    |j                  |_         | j        ||fi |S r   r  r  s        rr   visit_notendswith_op_binaryz'SQLCompiler.visit_notendswith_op_binary  sI    ,v|44+t+FHCCCCCrt   c                     |j                             dd           } |j        j        | fi |d |j        j        | fi ||r#d|                     |t          j                  z   ndz   S )Nescapez LIKE  ESCAPE r   	modifiersr  rD   r   rZ   render_literal_valuer
   r  r   r   r  r   r  s        rr   r  z SQLCompiler.visit_like_op_binary  s    !%%h55 +FK*46626666+FL+D77B777

 J2268;NOOOO
 	
rt   c                     |j                             dd           } |j        j        | fi |d |j        j        | fi ||r#d|                     |t          j                  z   ndz   S )Nr  z
 NOT LIKE r  r   r  r  s        rr   r  z#SQLCompiler.visit_notlike_op_binary  s    !%%h55*FK*46626666+FL+D77B777

 J2268;NOOOO
 	
rt   c                     |j                             dd           }d |j        j        | fi |d |j        j        | fi |d|r#d|                     |t          j                  z   ndz   S )Nr  lower(z) LIKE lower(rd  r  r   r  r  s        rr   visit_ilike_op_binaryz!SQLCompiler.visit_ilike_op_binary      !%%h55*FK*46626666+FL+D77B7777

 J2268;NOOOO
 	
rt   c                     |j                             dd           }d |j        j        | fi |d |j        j        | fi |d|r#d|                     |t          j                  z   ndz   S )Nr  r  z) NOT LIKE lower(rd  r  r   r  r  s        rr   visit_notilike_op_binaryz$SQLCompiler.visit_notilike_op_binary  r  rt   c                 ^    |j                             dd          } | j        ||rdndfi |S )Nr`   Fz BETWEEN SYMMETRIC z	 BETWEEN r  r  rq  r   r   r  r   r`   s        rr   visit_between_op_binaryz#SQLCompiler.visit_between_op_binary  sN    $((e<<	,t,YG))K
 
KM
 
 	
rt   c                 ^    |j                             dd          } | j        ||rdndfi |S )Nr`   Fz NOT BETWEEN SYMMETRIC z NOT BETWEEN r  r  s        rr   visit_notbetween_op_binaryz&SQLCompiler.visit_notbetween_op_binary  sQ    $((e<<	,t,)2G%%
 
 
 
 	
rt   c                    |sM|j                             | j                  }|j        r'|                    |          } | j        |fd||d|S |s	|rA| j        r:|j        #|j        t          j
        d|j        z             | j        |fddi|S |                     |          }|| j        v r| j        |         }	|	|ur||	j        s|j        r;|	j                            |j                  st          j
        d|j        z            |	j        s|j        r%t          j
        d|j        d|j        d          |x| j        |j        <   | j        |<    | j        |fd	|j        i|S )
NT)skip_bind_expressionrk  rm  z@Bind parameter '%s' without a renderable value not allowed here.rk  zIBind parameter '%s' conflicts with unique bind parameter of the same namezbindparam() name 'z' 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_z').	expanding)r   dialect_implr   _has_bind_expressionbind_expressionr   ro  r	  rV  r   r{  r  render_literal_bindparam_truncate_bindparamr  rg   r   intersection_is_crudr  r  )
r   rJ  rk  rm  r  r   implr  r   existings
             rr   visit_bindparamzSQLCompiler.visit_bindparam  s     $ 
	>..t|<<D( "&"6"6y"A"A#t|#)-*?"/	 
     	2 	t7K 	&9+=+E&9;D=I   140 159?   ''	224:z$'Hy((O'0'7",99):MNN *A#-(  
 & 	)*< 	** %===)---9   8A@
9=!DJt$4$t$
 
%/
39
 
 	
rt   c                 F    |j         }|                     ||j                  S r   )rW  r  r   )r   rJ  r   r	  s       rr   r  z$SQLCompiler.render_literal_bindparam  s"    )((	???rt   c                 t    |                     | j                  }|r ||          S t          d|z            )a  Render the value of a bind parameter as a quoted literal.

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

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

        z(Don't know how to literal-quote value %r)_cached_literal_processorr   r   )r   r	  r   	processors       rr   r  z SQLCompiler.render_literal_value  sK     33DLAA	 	9U###%:UB  rt   c                     || j         v r| j         |         S |j        }t          |t          j                  r|                     d|          }|| j         |<   |S )NrJ  )r  r  r  r   r  r  )r   rJ  	bind_names      rr   r  zSQLCompiler._truncate_bindparam$  sb    ''?9--M	i!:;; 	K22;	JJI &/	"rt   c                    ||f| j         v r| j         ||f         S |                    | j                  }t          |          | j        dz
  k    rd| j                             |d          }|dt          | j        dz
  d                   dz   t          |          dd          z   }|dz   | j         |<   n|}|| j         ||f<   |S )N   r   r   r  r   )r   	apply_mapr  rO  r  r  maxhex)r   ident_classr   anonnamecounter	truncnames         rr   r  z!SQLCompiler._truncated_identifier1  s    $"666'd(;<<>>$-00x==4,q000*..{A>>GS!2Q!6:::;g,,qrr"# 
 18!D -- I4=k401rt   c                     || j         z  S r   )r  r   r   s     rr   
_anonymizezSQLCompiler._anonymizeD  s    dm##rt   c                     | j         r2||                    |           n| j                            |           |rd| _        d|z  S | j        d|iz  S )NTz([EXPANDING_%s])r   )r  r6  r  contains_expanding_parametersr  )r   r   positional_namesr  r   s        rr   r  zSQLCompiler.bindparam_stringG  so     ? 	.+ ''---- ''--- 	615D.%,,$~55rt   c           	                                             ||d<   t          |j        t          j                  r                     d|j                  }n|j        }d}d}	| j        v rJ j        |         }
||
u }	||
j        v s||
u rd}n)|
|j        v r	 j        |
= nt          j
        d|z            |s|rO|j        D|j        }|j        j        }t          |t          j                  r                     d|          }n|}d }|r| j        |<   d|j        j        v r:d j        vr1 j                            d|j        j        d         i           _        | j        vr  j        |fi | |sP| j        vrF|j        rd _         j                            ||          }|j        rt          |j        t,          j                  r|j        }n4t          |j        t,          j                  r|j        j        d         }nJ d t5          j        |j                  D             }|d	d
                     fd|D                       z  z  } j        rg x|d<    j        |<   |d  j         ||j!        fi |d |j        j"         fddi|z  }|j#        r|d  j         ||j#        fi |z   z  }| j        |<   |r|s|	r j                            ||          S |ri j                            ||          } j        $                    |          r j        %                    |          }| &                    |          z  }|S  j                            ||          S d S )Nvisiting_cter  TFz5Multiple, unrelated CTEs found with the same name: %r
autocommitr   c                     g | ]}||S r   rn   rp   r  s     rr   r  z)SQLCompiler.visit_cte.<locals>.<listcomp>  s%     " " "= (==rt   r  r   c              3   L   K   | ]}j                             |          V  d S r   )r   format_column)rp   r  r   s     rr   rG  z(SQLCompiler.visit_cte.<locals>.<genexpr>  sG       " " % !M77>>" " " " " "rt   r  r   
rg  r  )'r1  r  r   r   r  r  r.  	_restatesr  r   r{  
_cte_aliasr   r   r   rf   	visit_cte	recursiver/  r   format_aliasoriginalr	   SelectCompoundSelectr:  r   unique_listinner_columnsrB   r  r0  _generate_prefixes	_prefixesr   	_suffixes_requires_quotesr  get_render_as_alias_suffix)r   cterg  ashint	fromhintsr  r   cte_name
is_new_cteembedded_in_current_named_cteexisting_ctepre_alias_ctecte_pre_alias_namer  
col_source
recur_colss   `               rr   r  zSQLCompiler.visit_cteU  s    	!$~ch 9:: 	 11'38DDHHxH
(-%t(((,X6L,8L,H) l,,,|0C0C"

.. Il++&(*23  
  
	*Z 
	*~) #%(^%8"0(2KLL )-)C)C!3* *& !$%)" :	&*-Dh'  >>> (>>>)-)?)E)E$ck&D('* *& DI--}77777% '&#TY*>*>= /*.D'}11#x@@= !#,
0ABB %%(\

#CL*2KLL %%(\%9!%<

$" "!%!1*2J!K!K" " "J F		 " " " ")3" " "   D ? OLNNF-.1DS1I+D+CII&IIII3CL3 %)-3    = C"9$"9S]# #.4# #  D "&	# 	A A"? A}11#x@@@! A}11#7IJJ=11(;; =#}228<<H77AAA}11#x@@@	A 	Art   c                    |s|rBt          |j        t          j                  r|                     d|j                  }n|j        }|r| j                            ||          S |rj |j        j        | fddi|| 	                    | j                            ||                    z   }|r"||v r| 
                    ||||         |          }|S  |j        j        | fi |S )Nr  rg  T)r  r   r   r  r  r   r  r  r   r  format_from_hint_text)	r   r  rg  r  iscrudr  r   
alias_namerets	            rr   visit_aliaszSQLCompiler.visit_alias  s*     	(V 	(%*h&?@@ (!77LL

"Z
 	E=--eZ@@@ 	E3%.3 !%+ //**5*== C  Ui//00	% 0&  J45>4TDDVDDDrt   c                 .    d|d<   d | j         |fi |z  S )NTlateralz
LATERAL %s)r  )r   r  r   s      rr   visit_lateralzSQLCompiler.visit_lateral  s,    9.d.w=="====rt   c                      | j         |fddi|d |                                j        | fi |}|j        |d |j        j        | fi |z  z  }|S )Nrg  Tz TABLESAMPLE z REPEATABLE (%s))r  _get_methodr   seed)r   tablesamplerg  r   r  s        rr   visit_tablesamplezSQLCompiler.visit_tablesample  s    D[<<<<<<<8K##%%8DDDDD

 '&3 3D??B?? D rt   c                     d|z   S )Nr   rn   )r   alias_name_texts     rr   r  z&SQLCompiler.get_render_as_alias_suffix  s    ''rt   c                 B    | j                             ||||f           d S r   )r  r6  )r   keynamer   objectsr   s        rr   r  zSQLCompiler._add_to_result_map  s(    ##WdGU$CDDDDDrt   c	                      j                              j                  }	|	j        r%|s|r!|	                              }
|r fd}nd}n}
|r j        }nd}|s|
}nt          t          j                  r'|
urt          |
j
        j        f          }nL|
}nH||rt          |
|j        f          }n*|rwt          t          j                  r]j        sVj        Ot          j        t           j                  s0t          |
t          j        j
                  j        f          }nt          t          j                  sat          t          j                  rj        r@t/          d          rt          t0          j                  rt          |
j                  }n6|
ur0t          |
t          j        j
                  j        f          }n|
}|                    ||            |j         fi |S )z.produce labeled columns present in a select().c                 @                         | |f|z   |           d S r   )r  )r	  r   r
  r   r    r   s       rr   r  z;SQLCompiler._label_select_column.<locals>.add_to_result_map  s5    ++y7':E    rt   N)r   r   r  )r   r  r   _has_column_expressioncolumn_expressionr  r  r   Labelr   r   r   
_key_labelColumnClauser  ra   r	   r  _as_truncatedr  
TextClauseUnaryExpressionwraps_column_expressionhasattrr   Function
anon_labelupdater   )r   r[   r    r  rg  column_clause_argsr   rk  need_column_expressionsr  col_exprr  result_exprs   ` `          rr   _label_select_columnz SQLCompiler._label_select_column	  s    {''55& 	)#	)':	) --f55H" )       %)!!H" )$($;!!$(!$ 0	#"KK// .	#v%%+fkfn5F   'D'$6+<*>  KK
 !	#68#899!	# %!	# (v|Z->?? ) (&v{33!:-  KK 68#677	# vx'?@@	# 1		# FF++	# fi&899	# (&2CDDKKV## (&v{33!:-  KK #K!!"7/ 	" 	
 	
 	
 .{-dII6HIIIrt   c                 F    |                      ||          }|r|d|z   z  }|S r~  )get_from_hint_text)r   sqltextra   hintr  hinttexts         rr   r  z!SQLCompiler.format_from_hint_texte  s2    **5$77 	&sX~%Grt   c                     d S r   rn   )r   byfromss     rr   get_select_hint_textz SQLCompiler.get_select_hint_textk      trt   c                     d S r   rn   r   ra   r  s      rr   r   zSQLCompiler.get_from_hint_textn  r'  rt   c                     d S r   rn   r)  s      rr   get_crud_hint_textzSQLCompiler.get_crud_hint_textq  r'  rt   c                 ,    d                     |          S r~  rB   )r   
hint_textss     rr   get_statement_hint_textz#SQLCompiler.get_statement_hint_textt  s    xx
###rt   c                 6    i i gfd |          S )zRewrite any "a JOIN (b JOIN c)" expression as
        "a JOIN (select * from b JOIN c) AS anon", to support
        databases that can't parse a parenthesized join correctly
        (i.e. sqlite < 3.7.16).

        c                    | d         v rd         |          S | 
v r
|          S |                                  x}
| <   |j        r|j        rt          |j        t
          j                  rt|                                  |j        fi ||_         |j        fi |}t          j	        |j
        gd                                          }|j        D ]}|j        |_        |j        |_        t#          t%          |j        j
        j        |j                            }|||j
        j        <   |||j
        j        <   |||j        j
        j        <   |||j        j
        j        <   t'          d                                                   D ]\  }}||v r||         d         |<   d                             |           ||_         |j        fi ||_        n|j        rd|d<    |j        ddi| nh|j        rR|j        rK|                    dd           dk    }	|	r                    i            d|d<    |j        ddi| |	rd= n |j        ddi| |S )	Nr3  T)
use_labelsselect_containertransform_cluecloneinside_selectrn   )r  is_selectable_is_joinr  rZ   r	   FromGrouping_reset_exportedrD   r  r   r  r  r  r  r   _labelrK  zipr(  itemsr  onclause_is_from_container_copy_internals
_is_selectr  r6  )r   r   newelemrZ   selectable_r  translate_dictkvbarrier_selectclonedcolumn_translatevisits             rr   rJ  z=SQLCompiler._transform_select_for_nested_joins.<locals>.visit  s   *2...'+G44F""g&(/(8(88GfWo %D;$D; w}j.EFFD; '')))$uW\88R88gm22r22(/]O  %''  % & &A#$5AL vAHH!%-/??" " 6Au}126Au}23=Hw}49:>Iw}4:; !!1"!5!;!;!=!=>> D DDAqN** 3A2C(,Q/ $++N;;; +#(5)9#@#@R#@#@  + ; (:#$''::e:r::::& ;7+= ;FF+T226HH  " 0$++B///'6#$''::e:r:::! -(,''::e:r:::Nrt   rn   )r   r[   rH  rI  rJ  s     @@@rr   "_transform_select_for_nested_joinsz.SQLCompiler._transform_select_for_nested_joinsw  sO     4O	 O	 O	 O	 O	 O	 O	b uV}}rt   c                     t          d |j        D                       t          fd|j        D                       fd| j        D             | _        d S )Nc              3   (   K   | ]}|j         |fV  d S r   r  r  s     rr   rG  zESQLCompiler._transform_result_map_for_nested_joins.<locals>.<genexpr>  s:       
 
"#Q\1
 
 
 
 
 
rt   c              3   6   K   | ]}|j                  |fV  d S r   rN  )rp   r  	inner_cols     rr   rG  zESQLCompiler._transform_result_map_for_nested_joins.<locals>.<genexpr>  s/      LL!)AL)1-LLLLLLrt   c                 X    g | ]&\  }}}}||t          fd |D                       |f'S )c                 <    g | ]}                     ||          S rn   r  )rp   r   ds     rr   r  zQSQLCompiler._transform_result_map_for_nested_joins.<locals>.<listcomp>.<listcomp>  s%    ???3quuS#???rt   tuple)rp   r  r   objstyprT  s        rr   r  zFSQLCompiler._transform_result_map_for_nested_joins.<locals>.<listcomp>  sW      
  
  
$T4 $????$???@@#F 
  
  
rt   )rK  r  r  )r   r[   transformed_selectrT  rP  s      @@rr   &_transform_result_map_for_nested_joinsz2SQLCompiler._transform_result_map_for_nested_joins  s      
 
'9'G
 
 
 
 
	 LLLLv7KLLLLL 
  
  
  
(,(< 
  
  
rt   r2  r3  c                     | j          }|r| j        n| j         d         }|d         }|d         }|r-|s+|                    |                    |          d          }n|                    ||          }|S )Nr3  r2  r3  rn   explicit_correlate_fromsimplicit_correlate_froms)r  r  _get_display_froms
difference)	r   r[   rg  r  r  r9  r2  r3  fromss	            rr   _display_froms_for_selectz%SQLCompiler._display_froms_for_select  s    
 z>-5I))4:b> 12^, 	' 	--)8)C)C * * *,	 .  EE --)8)5 .  E rt   c	           	      F    j         o| o j         o j        j         }
|
r)                               }  j        |f|||dd|	} j         }|r j        n j        d         }|p+|                    dd          p|                    dd          x|dk    rdsd|	v r|	d= |
rr                     |           |S  	                    ||          }|	
                                                    ddd	           d
}j        r#                               \  }}|r||dz   z  }nd }j        r|  j        j        fi |	z  }|  j        fi |	z  }d  fdj        D             D             }rU|St%          t'          d j        D             d |j        D                                 fd j        D              _                             |||||	          }j        r0 fdj        D             }|r|d                     |          z   z  } j        r|r                                 |z   }j        r|d  j        j        fi |	z   z  } j                            d           s|r
|rd|z   dz   S |S )NT)rg  r  r  r  nested_join_translationr3  r  Fr4  r   r  )r  rk  zSELECT r  c                     g | ]}||S r   rn   r  s     rr   r  z,SQLCompiler.visit_select.<locals>.<listcomp>O  s)     
 
 
 }  }}rt   c                 N    g | ]!\  }}                     ||           "S ))r   r  r  )	rp   r   r    rg  r  r  r  r[   r   s	      rr   r  z,SQLCompiler.visit_select.<locals>.<listcomp>Q  sY        !D& ))'&,C *    rt   c                     g | ]\  }}|S rn   rn   rp   r  r   s      rr   r  z,SQLCompiler.visit_select.<locals>.<listcomp>f  s    HHHksDTHHHrt   c                     g | ]\  }}|S rn   rn   ri  s      rr   r  z,SQLCompiler.visit_select.<locals>.<listcomp>g  s,       'S$   rt   c                 X    g | ]&\  }}}}||t          fd |D                       |f'S )c              3   D   K   | ]}                     ||          V  d S r   rS  )rp   o	translates     rr   rG  z6SQLCompiler.visit_select.<locals>.<listcomp>.<genexpr>o  s1      !C!C!)--1"5"5!C!C!C!C!C!Crt   rU  )rp   r  r   r   r   rn  s        rr   r  z,SQLCompiler.visit_select.<locals>.<listcomp>n  sW     $ $ $)CsE dE!C!C!C!Cs!C!C!CCCUK$ $ $rt   c                 :    g | ]\  }}|d j         j        fv |S *r   r   )rp   dialect_namehtr   s      rr   r  z,SQLCompiler.visit_select.<locals>.<listcomp>x  s<       &\2C):#;;; ;;;rt   rc  rd  )r2  r  r   supports_right_nested_joinsrK  visit_selectr  r  rZ  _setup_select_stackcopyr  _hints_setup_select_hintsr  r  get_select_precolumns_columns_plus_namesrK  r<  r  _compose_select_body_statement_hintsr/  r  r@  r  r6  )r   r[   rg  r  r  r  rd  select_wraps_forr  r   needs_nested_translationrY  r  r  r9  ra  	hint_textbyfromr  per_dialectr  r  r  rn  s   ```                 @@@@rr   rv  zSQLCompiler.visit_select  sb     =++=J= L<<	 	! $ 	!%!H!H" " %4$"#-(,   D z>-5I))4:b>  >yy7??>yy5u==	
5 A"'
 # 	,':f'D'D*+# 	" ;;.   K((HH#[[]]!!$)EJJ	
 	
 	
 = 	 $ 8 8 @ @Iv (	C'F 	P+D+FF4DOOOOOD**6<<V<<<
 
         %+$>  
 
 
"  	#3#? HHV-GHHH +;+O    I$ $ $ $-1-A$ $ $D 
 ((&-
 
 " 	H   *0*A  K
  Hd::;GGGG9 	4 	4**,,t3D 	C1$1( ,2   D 	
r 	g 	6 	:##Krt   c                      t           fd|j                                        D                       }                     |          }||fS )Nc           	      x    g | ]6\  \  }}}|d j         j        fv ||d|                    d          iz  f7S )rq  r   T)r  r   r   r   )rp   from_r   r#  r   s       rr   r  z3SQLCompiler._setup_select_hints.<locals>.<listcomp>  sn        /$UGhsDL$5666 u77T7JJKL 766rt   )rK  ry  r=  r&  )r   r[   r  r  s   `   rr   rz  zSQLCompiler._setup_select_hints  sh        39-2E2E2G2G  

 

 --f55	&  rt   c                 R   |d         }|d         }|r-|s+|                     |                    |          d          }n|                     ||          }t          t          j        |           }|                    |          }	||	|d}
| j                            |
           |S )Nr2  r3  rn   r\  )r3  r2  r	   )r_  r`  r]   r	   _from_objectsrf   r  r6  )r   r[   r9  rg  r  r2  r3  ra  new_correlate_fromsall_correlate_froms	new_entrys              rr   rw  zSQLCompiler._setup_select_stack  s     12^, 	' 	--)8)C)C * * *,	 .  EE --)8)5 .  E
 "*":E"BCC177HH 02 
 
	
 	
)$$$rt   c                     |d                     |          z  }|rY|dz  }|j        r'|d                      fd|D                       z  }n=|d                      fd|D                       z  }n|                                 z  }|j         |j        j         fi }|r|d|z   z  }|j        j        r|  j        |fi z  }|j         |j        j         fi }|r|d|z   z  }|j	        j        r|  j
        |fi z  }|j        |j        |  j        |fi z  }|j        |  j        |fi z  }|S )Nr   z 
FROM c                 2    g | ]} |j         fd dS )Trg  r  r   )rp   fr  r   r   s     rr   r  z4SQLCompiler._compose_select_body.<locals>.<listcomp>  sT         -, )- CI   rt   c                 0    g | ]} |j         fd diS )rg  Tr   )rp   r  r   r   s     rr   r  z4SQLCompiler._compose_select_body.<locals>.<listcomp>  sC        -,TII$I&II  rt   z 
WHERE z	 
HAVING )rB   ry  ra  _whereclauser   _group_by_clauser  r;  _having_order_by_clauser<  r=  r>  r?  _for_update_argfor_update_clause)r   r  r[   r  ra  r  r   ts   `    `` rr   r}  z SQLCompiler._compose_select_body  s    			-((( 	(JD} 		      "'	     		    !&     D%%'''D*6#6tFFvFFA (a'"* 	;(D(::6:::D>%11$AA&AAA )q(("* 	;(D(::6:::D  ,$0%D%f77777D!-*D*6<<V<<<Drt   c                 \     d                      fd|D                       }|r|dz  }|S )Nr  c              3   ^   K   | ]'\  }}||j         j        k     |j        fi V  (d S r   r  )rp   prefixrs  r   r   s      rr   rG  z1SQLCompiler._generate_prefixes.<locals>.<genexpr>  s]       
 
$#|t|7H'H'H &F%d11b11'H'H'H'H
 
rt   r-  )r   stmtprefixesr   r  s   `  ` rr   r  zSQLCompiler._generate_prefixes  sZ     
 
 
 
 
(0
 
 
 
 

  	cMFrt   c                 (     j         r.t           fd j        D             g            j        z    _                              j                  dz   }|d                    d  j                                        D                       z  }|dz  }|S )Nc                 *    g | ]}j         |         S rn   )r0  )rp   r  r   s     rr   r  z2SQLCompiler._render_cte_clause.<locals>.<listcomp>  s!    CCC#T(-CCCrt   r  , 
c                     g | ]}|S rn   rn   )rp   txts     rr   r  z2SQLCompiler._render_cte_clause.<locals>.<listcomp>	  s     C C C C C Crt   z
 )r  sumr  r  get_cte_preambler/  rB   values)r   cte_texts   ` rr   r@  zSQLCompiler._render_cte_clause  s    ? 	CCCCCCCRHH"#  (()<==CFKK C C	0@0@0B0B C C CDDDErt   c                     |rdS dS )NzWITH RECURSIVEWITHrn   )r   r  s     rr   r  zSQLCompiler.get_cte_preamble	  s     	##6rt   c                     |j         rdpdS )zcCalled when building a ``SELECT`` statement, position is just
        before column list.

        r   r   )	_distinctr   r[   r   s      rr   r{  z!SQLCompiler.get_select_precolumns	  s    
 /K525rt   c                 :     |j         j        | fi |}|rd|z   S dS )z5allow dialects to customize how GROUP BY is rendered.z
 GROUP BY r   )r  r   )r   r[   r   group_bys       rr   r;  zSQLCompiler.group_by_clause	  9     >6*=dIIbII 	(**2rt   c                 :     |j         j        | fi |}|rd|z   S dS )z5allow dialects to customize how ORDER BY is rendered.z
 ORDER BY r   )r  r   )r   r[   r   r  s       rr   r<  zSQLCompiler.order_by_clause	  r  rt   c                     dS )Nz FOR UPDATErn   r  s      rr   r  zSQLCompiler.for_update_clause%	  s    }rt   c                 *    t          j        d          )Nz@RETURNING is not supported by this dialect's statement compiler.r  )r   r  returning_colss      rr   returning_clausezSQLCompiler.returning_clause(	  s    ,
 
 	
rt   c                     d}|j         |d | j        |j         fi |z   z  }|j        %|j         |dz  }|d | j        |j        fi |z   z  }|S )Nr   z
 LIMIT z

 LIMIT -1z OFFSET )r=  r   r>  )r   r[   r   r  s       rr   r?  zSQLCompiler.limit_clause.	  s}    +K,$,v/C"J"Jr"J"JJJD ,#+%Jf.C!J!Jr!J!JJJDrt   c                 P   |s|r| j                             |          }|r@|r>| j                             |          dz   | j                             |j                  z   }	n| j                             |j                  }	|r"||v r|                     |	|||         |          }	|	S dS )Nr  r   )r   r  r  r  r   r  )
r   ra   rg  r  r  r  
use_schemar   r  r  s
             rr   visit_tablezSQLCompiler.visit_table8	  s      	V 	#}>>uEE 6. 6M../?@@m))%*556  m))%*55 Ui//00	% 0&  J2rt   c                     |j         rd}n|j        rd}nd} |j        j        | fddi||z    |j        j        | fddi|z   dz    |j        j        | fi |z   S )Nz FULL OUTER JOIN z LEFT OUTER JOIN z JOIN rg  T ON )r6   isouterrD   r   rZ   r>  )r   rB   rg  r   	join_types        rr   
visit_joinzSQLCompiler.visit_joinU	  s    9 	!+II\ 	!+II I(DI(EEdEfEE+dj+DHHHHHI  /dm.t>>v>>	?	
rt   c                      t           fd|j                                        D                       }|j        |v r(                     ||j        ||j                 d          }||fS )Nc                 D    g | ]\  \  }}}|d j         j        fv ||fS rp  rr  )rp   ra   r   r  r   s       rr   r  z1SQLCompiler._setup_crud_hints.<locals>.<listcomp>f	  sF       /$UGisDL$5666 	"666rt   T)rK  ry  r=  ra   r  )r   r  
table_textdialect_hintss   `   rr   _setup_crud_hintszSQLCompiler._setup_crud_hintsd	  s       37;3D3D3F3F  
 
 :&&33DJdj(A4 J j((rt   c                    | j          }| j                             t                      t                      |d           t          j        | |t          j        fi |}|s9| j        j        s-| j        j        s!t          j
        d| j        j        z            |j        r6| j        j        s!t          j
        d| j        j        z            |d         }n|}| j        | j        j        }d}|j        r| | j        ||j        fi |z  }|dz  }                    |j                  }	|j        r|                     ||	          \  }
}	||	z  }|s|s'|dd                    fd	|D                       z  z  }| j        s|j        r2|                     || j        p|j                  }| j        r|d
|z   z  }nd }|j        N | j        | j        fi |}| j        r+|r)| j        j        r|d
|                                 |z  }np|d|z  z  }ng|s|r|dz  }n]|j        r&|dd                    d |D                       z  z  }n0d                    d |D                       }|d|z  z  }|r|| _         |j!         | j        |j!        fi |}|r|d
|z   z  }|r| j        s|d
|z   z  }| j        r%|r#| j        j        s|                                 |z   }| j         "                    d           |rd|z   dz   S |S )Nr2  r3  r	   zWThe '%s' dialect with current database version settings does not support empty inserts.zcThe '%s' dialect with current database version settings does not support in-place multirow inserts.r   zINSERT zINTO z (%s)r   c                 F    g | ]}                     |d                    S )r   )r  )rp   r  r   s     rr   r  z,SQLCompiler.visit_insert.<locals>.<listcomp>	  s+    JJJ!''!--JJJrt   r  z %sz DEFAULT VALUESz
 VALUES %sc              3   Z   K   | ]&}d d                     d |D                       z  V  'dS )r  r   c              3   &   K   | ]}|d          V  dS )r   Nrn   r  s     rr   rG  z5SQLCompiler.visit_insert.<locals>.<genexpr>.<genexpr>	  s&      'E'E!'E'E'E'E'E'Ert   Nr-  )rp   crud_param_sets     rr   rG  z+SQLCompiler.visit_insert.<locals>.<genexpr>	  sV        & dii'E'En'E'E'EEEF     rt   c                     g | ]
}|d          S )r   rn   r  s     rr   r  z,SQLCompiler.visit_insert.<locals>.<listcomp>	  s    2M2M2MA1Q42M2M2Mrt   z VALUES (%s)r3  rc  rd  )#r  r6  r]   r   _setup_crud_paramsISINSERTr   supports_default_valuessupports_empty_insertr   r{  r   _has_multi_parameterssupports_multivalues_insertr   r  r  format_tablera   ry  r  rB   r%  r$  r  returning_precedes_valuesr[   r   _insert_from_selectr  cte_follows_insertr@  insert_single_values_expr_post_values_clauser6  )r   insert_stmtrg  r   r  crud_paramscrud_params_singler  r  r  r  r  select_textr  post_values_clauser   s                  @rr   visit_insertzSQLCompiler.visit_insertr	  sQ   z>
#&55 #) 	
 	
 	
 -+t}
 
02
 

 		L8		 L6		
 "!\./   , 		-<; &137<3DE  
 "-Q!,="&,"F  	+D+[2 68  D 	**;+<==
 	L 22;
KKMAz
 	%< 	GdiiJJJJ7IJJJ   D > 	$[3 	$#44T^E{/E    - /...#)&$,t'?FF2FFKy ,X ,$,*I ,4#:#:#<#<#<kkJJ++ 	K!8 	K%%DD. 	KL		  *5     DD )-		2M2M2M2M2M(N(N%N%>>>D K1J.*6!-/" "35" " " 1000 	+D$B 	+C***D9 	4 	4$,*I 	4**,,t3D
r 	:##Krt   c                     dS )z3Provide a hook for MySQL to add LIMIT to the UPDATENrn   )r   update_stmts     rr   update_limit_clausezSQLCompiler.update_limit_clause	  s    trt   c                 ,    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.

        Trg  r  r   )r   r  
from_tableextra_fromsr   s        rr   update_tables_clausez SQLCompiler.update_tables_clause	  s-     8,z,TEE$E"EEErt   c                      t          d          )z~Provide a hook to override the generation of an
        UPDATE..FROM clause.

        MySQL and MSSQL override this.

        zCThis backend does not support multiple-table criteria within UPDATEr   r   r  r  r  
from_hintsr   s         rr   update_from_clausezSQLCompiler.update_from_clause	  s     "%
 
 	
rt   c                      j          }|j        }t          |          }|rJt          t	          j        |j                            fd|D             }                    |          }n
g }|j        h} j                             |||d           d}	|j	        r|	  j
        ||j	        fi |z  }	  j        ||j        |fi |}
t          j         |t          j        fi |}|j        r                     ||
          \  }}
nd }|	|
z  }	|	dz  }	|o j        |	d                     fd|D                       z  }	 j        s|j        r/ j        r(|	d                     | j        p|j                  z   z  }	|r   j        ||j        ||fi |}|r|	d|z   z  }	|j          j        |j        fi |}|r|	d|z   z  }	                     |          }|r|	d|z   z  }	 j        s|j        r/ j        s(|	d                     | j        p|j                  z   z  }	 j        r|r                                 |	z   }	 j                             d	           |rd
|	z   dz   S |	S )Nc                     g | ]}|v|	S rn   rn   )rp   r  
main_fromss     rr   r  z,SQLCompiler.visit_update.<locals>.<listcomp>
  s*     " " "!:*=*=*=*=*=rt   r  zUPDATE z SET r   c              3   j   K   | ]-}|d                                         dz   |d         z   V  .dS )r   )r  =r   Nr   )rp   r  r  r   s     rr   rG  z+SQLCompiler.visit_update.<locals>.<genexpr>2
  sd       
 
  aD##D#FFd
 
 
 
 
 
rt   r   WHERE r3  rc  rd  )r  _extra_fromsboolr]   r	   r  ra   rf   r6  r  r  r  r   r  ISUPDATEry  r  'render_table_with_column_in_update_fromrB   r%  r$  r  r  r  r  r   r  r  r@  r6  )r   r  rg  r   r  r  is_multitablerender_extra_fromsr2  r  r  r  r  extra_from_textr  r?  r  r  s   `               @@rr   visit_updatezSQLCompiler.visit_update	  s   z>!.[)) 		2Z5k6GHHIIJ" " " "&" " " )..{;;OO!#*01O
#2 /) 	
 	
 	
   	+D+[2 68  D /T.*,>
 
BD
 

 -+t}
 
02
 
  	!(,(>(>Z) )%M:: !M
JdJ 	 			 
 
 
 
 
 !	
 
 
 
 
 	
 > 	[3 	- d33!I;3I     		.5d5!"	 
  O  .o--#/[5<<<<A &	A%//<< 	'C,&&D N	)4	0	 C$//T^E{/E   D 9 	4 	4**,,t3D
r 	:##Krt   c                 6    t          j        | | j                  S r   )r   _key_getters_for_crud_columnr   r   s    rr   r  z(SQLCompiler._key_getters_for_crud_columnd
  s    0t~FFFrt   c                      t          d          )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 DELETEr   r  s         rr   delete_extra_from_clausez$SQLCompiler.delete_extra_from_clauseh
  s     "%
 
 	
rt   c                 2    |                     | dd          S )NT)rg  r  r   )r   delete_stmtr  r  s       rr   delete_table_clausezSQLCompiler.delete_table_clausex
  s    ,,T$t,LLLrt   c                 t   | j          }t          j        | |t          j        fi | |j        }|j        h                    |          }| j                             |||d           d}|j        r| | j	        ||j        fi |z  }|dz  }| 
                    ||j        |          }|j        r|                     ||          \  }	}nd }	||z  }|j        r(| j        r!|d|                     ||j                  z   z  }|r  | j        ||j        ||	fi |}
|
r|d|
z   z  }|j         |j        j        | fi |}|r|d|z   z  }|j        r(| j        s!|d|                     ||j                  z   z  }| j        r|r|                                 |z   }| j                             d           |rd|z   dz   S |S )	Nr  zDELETE FROM r  r  r3  rc  rd  )r  r   r  ISDELETEr  ra   rf   r6  r  r  r  ry  r  r$  r  r  r  r  r   r  r@  r6  )r   r  rg  r   r  r  r2  r  r  r  r  r  s               rr   visit_deletezSQLCompiler.visit_delete{
  s   z>k4=GGBGGG!.&,-33K@@
#2 /) 	
 	
 	
   	+D+[2 68  D 	--*K
 

  	!(,(>(>Z) )%M:: !M
! 	- d33!7     		.;d;!	 
  O  .o--#/;(;DGGBGGA &	A%! 	$*H 	C$//[3   D 9 	4 	4**,,t3D
r 	:##Krt   c                 <    d| j                             |          z  S )NzSAVEPOINT %sr   format_savepointr   savepoint_stmts     rr   visit_savepointzSQLCompiler.visit_savepoint
  s     > >~ N NNNrt   c                 <    d| j                             |          z  S )NzROLLBACK TO SAVEPOINT %sr   r  s     rr   visit_rollback_to_savepointz'SQLCompiler.visit_rollback_to_savepoint
  s&    )DM,J,J-
 -
 
 	
rt   c                 <    d| j                             |          z  S )NzRELEASE SAVEPOINT %sr   r  s     rr   visit_release_savepointz#SQLCompiler.visit_release_savepoint
  s&    %(F(F)
 )
 
 	
rt   )NF)NNTF)NFFN)NT)NFTr   )FTr   )FFF)FFNN)FFFNNTF)FTNr   FNF)FFFNT)r   r   r   r   EXTRACT_MAPr  COMPOUND_KEYWORDSr7  r#  r!  r"  r  r%  r  r  r  ro  r  r5  r  r  r)  r*  r   r   r+  r   memoized_instancemethodr1  
contextlibcontextmanagerr:  r&  memoized_propertyrL  rP  r   r   r   dependenciesr^  ra  rh  ru  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%  rC  rJ  rP  rU  rX  r^  ra  rf  rh  rk  r[  rx  rz  r|  r  r  rq  rN  rO  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/  rK  rZ  r   	frozensetr  rb  rv  rz  rw  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  rn   rt   rr   r  r    sr
         K)%**H*x(
 KI
 !& /4+
 %*! O  %  N !% )+*Oo <AG* G* G* G*R A A XA 
!% % "!%   .
 
 
 

 
 
# # #   X6 6 6 6p 3 3 X3
 T122N N 32N  O O O O .3 
  
  
  
F .3   > !#"/ / / /b
 
 
 =A&O &O &O &OPA A A    I I I  
  

 
 
( >B   @        $  &K K K
 
 

 
 
.
 
 
8
 
 

 
 

 
 
 @  @  @  @D8 8 8
 
 
C C C =>1 1 1 1f- - -  >B B BB B B
 
 


 
 
< < << < <
 
 
 >CM M M M68 8 8  
 
 

 
 


 
 
 05   *G G GG G G 
I I IA A AD D DA A AD D DA A AD D D
 
 
	
 	
 	
	
 	
 	
	
 	
 	

 
 

 
 
 $";
 ;
 ;
 ;
z@ @ @  &    &$ $ $ 6;6 6 6 6" zA zA zA zA~ E E E EB> > >   ( ( (E E E " %ZJ ZJ ZJ ZJx        $ $ $[ [ [z
 
 
 .4-
YY[[	)NIIKK+HI    8  %N N N N`! ! !  :4 4 4l  	 	 	  6 6 6      
 
 
      :
 
 
 
) ) )n n n n`  F F F
 
 
d d d dL 
G G G
 
 
 M M MH H H HTO O O
 
 


 
 
 
 
rt   r  c                   H    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )StrSQLCompilera  A :class:`.SQLCompiler` subclass which allows a small selection
    of non-standard SQL features to render into a string value.

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

    .. seealso::

        :ref:`faq_sql_expression_string`

    c                     dS )Nz<name unknown>rn   r  s     rr   r  z$StrSQLCompiler._fallback_column_name
  s    rt   c                 V     | j         |j        fi |d | j         |j        fi |dS )N[])r   rD   rZ   r]  s       rr   visit_getitem_binaryz#StrSQLCompiler.visit_getitem_binary
  sJ    DL++++++DL,,,,,,
 	
rt   c                       | j         ||fi |S r   r  r]  s       rr   visit_json_getitem_op_binaryz+StrSQLCompiler.visit_json_getitem_op_binary
      (t(@@R@@@rt   c                       | j         ||fi |S r   r  r]  s       rr   !visit_json_path_getitem_op_binaryz0StrSQLCompiler.visit_json_path_getitem_op_binary
  r  rt   c                 <    d| j                             |          z  S )Nz<next sequence value: %s>)r   format_sequence)r   seqr   s      rr   r)  zStrSQLCompiler.visit_sequence
  s    *T]-J-J3-O-OOOrt   c                 t      fdt          j        |          D             }dd                    |          z   S )Nc           	      B    g | ]}                     d |ddi           S r
  rg  rp   r  r   s     rr   r  z3StrSQLCompiler.returning_clause.<locals>.<listcomp>
  s?     
 
 
 %%dAtUB??
 
 
rt   z
RETURNING r   )r   _select_iterablesrB   )r   r  r  columnss   `   rr   r  zStrSQLCompiler.returning_clause
  sO    
 
 
 
/??
 
 

 dii0000rt   c                 T     dd                      fd|D                       z   S )Nr  r   c              3   :   K   | ]} |j         fd dV  dS Tr  Nr   rp   r  r  r   r   s     rr   rG  z4StrSQLCompiler.update_from_clause.<locals>.<genexpr>  sS       #
 #
 !A OdjOOBOO#
 #
 #
 #
 #
 #
rt   r-  r  s   `   ``rr   r  z!StrSQLCompiler.update_from_clause  sT      #
 #
 #
 #
 #
 #
 #
 #
 #
 
 
 
 	
rt   c                 T     dd                      fd|D                       z   S )Nr   c              3   :   K   | ]} |j         fd dV  dS r*  r   r+  s     rr   rG  z:StrSQLCompiler.delete_extra_from_clause.<locals>.<genexpr>  sS        
  
 !A OdjOOBOO 
  
  
  
  
  
rt   r-  r  s   `   ``rr   r  z'StrSQLCompiler.delete_extra_from_clause	  sT     dii  
  
  
  
  
  
  
  
  
 
 
 
 	
rt   c                     d|z  S )Nz[%s]rn   r)  s      rr   r   z!StrSQLCompiler.get_from_hint_text  s    }rt   N)r   r   r   r   r  r  r  r  r)  r  r  r  r   rn   rt   rr   r  r  
  s         &     
 
 
A A AA A AP P P1 1 1
 
 

 
 
    rt   r  c                   .   e Zd Zej        d             Zej        d             Zd)dZd Zd Z	d Z
d Zd*d
Z	 d)dZd Zd Zd Z	 d+dZd Zd*d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d Z d  Z!d! Z"d" Z#d# Z$d$ Z%d% Z&d& Z'd' Z(d( Z)dS ),DDLCompilerc                 P    | j                             | j         d | j                  S )N)r   )r   statement_compilerr   r   s    rr   r   zDDLCompiler.sql_compiler  s-    |..L$T5N / 
 
 	
rt   c                     | j         j        S r   )r   r  r   s    rr   r  zDDLCompiler.type_compiler  s    |))rt   Nc                     d S r   rn   r   s     rr   r   zDDLCompiler.construct_params   r'  rt   c                    |j         }t          |j        t          j                  r|                                }| j        }|                    |j                  }t          |          dk    r|d         d}}n|d         |d         }}|	                    d|           |	                    d|           |	                    d|
                    |j                             | j                            |j        |z            S )Nr   r   r   r3  ra   r   fullname)contextr  targetr   Tablerx  r   format_table_seqrO  
setdefaultr  r   r  r   )r   ddlr   r7  r   pathra   schs           rr   	visit_ddlzDDLCompiler.visit_ddl#  s    +cj&,// 	NllnnG}H,,SZ88D4yyA~~!!Wbs!"XtAwsw...x---z8+@+@+L+LMMM 223=73JKKKrt   c                 J    | j                             |j                  }d|z   S )NzCREATE SCHEMA )r   format_schemar   )r   r"   r   s      rr   visit_create_schemazDDLCompiler.visit_create_schema6  s$    ,,V^<<&((rt   c                 f    | j                             |j                  }d|z   }|j        r|dz  }|S )NzDROP SCHEMA  CASCADE)r   rA  r   cascade)r   dropr   r  s       rr   visit_drop_schemazDDLCompiler.visit_drop_schema:  s<    ,,T\::&< 	JDrt   c                     |j         }| j        }d}|j        r |d                    |j                  dz   z  }|d|                    |          z   dz   z  }|                     |          }|r||dz   z  }|dz  }d}d}|j        D ]}|j         }		 |                     ||	j        o|           }
|
||z  }d}|d	|
z   z  }|	j        rd
}D# t          j
        $ r_}t          j        t          j
        t          j        d          |j        |	j        |j        d         fz            |           Y d }~d }~ww xY w|                     ||j                  }|r||d	z   |z   z  }|d|                     |          z  z  }|S )Nz
CREATE r  zTABLE rc  r  Ffirst_pkr  	Tz (in table '%s', column '%s'): %sr   )r  ) _include_foreign_key_constraintsz
)%s

)r   r   r  rB   r  create_table_suffixr'  r   primary_keyr   r{  r   rr  udescriptionr   argscreate_table_constraintsinclude_foreign_key_constraintspost_create_table)r   r"   ra   r   r  rM  	separatorrJ  create_columnr    	processedceconsts                rr   visit_create_tablezDDLCompiler.visit_create_tableA  s   =? 	4CHHU_--33D800777#=="66u== 	.'#--D	 #^ 	 	M"*F LL!F,>,Ox< )  	 (I%D &ID9,,D% $#H#   $ABB ,fk271:FG           ---3-S . 
 
  	-I$u,,Dd44U;;;;s   9C		D7AD22D7Fc                      |j         }|j        rd S                      ||          }d                     fd|j        D                       }|r|d|z   z  }|S )NrI  r  c              3   B   K   | ]}                     |          V  d S r   )r   rp   r!   r   s     rr   rG  z2DDLCompiler.visit_create_column.<locals>.<genexpr>z  s@       
 
)3DLL$$
 
 
 
 
 
rt   )r   systemget_column_specificationrB   constraints)r   r"   rJ  r    r  rY  s   `     rr   visit_create_columnzDDLCompiler.visit_create_columns  s    = 	4,,Vh,GG 
 
 
 
7=7I
 
 
 
 
  	 C%KDrt   c                 L    g }j         r|                    j                    j        }||                    |          nt	                      |                    fdj        D                        d                    d  fd|D             D                       S )Nc                 .    g | ]}|j         u|v|S rn   )rN  )rp   r  	omit_fkcsra   s     rr   r  z8DDLCompiler.create_table_constraints.<locals>.<listcomp>  s;       E---!92D2D 2D2D2Drt   z, 
	c              3      K   | ]}||V  	d S r   rn   )rp   ps     rr   rG  z7DDLCompiler.create_table_constraints.<locals>.<genexpr>  s4       
 
 }  }}}
 
rt   c              3      K   | ]R}|j         |                               j        j        rt          |dd          ;                    |          V  Sd S )N	use_alterF)_create_ruler   supports_alterr  r   r]  s     rr   rG  z7DDLCompiler.create_table_constraints.<locals>.<genexpr>  s        +3!..t44 4 3	 4
 #:{EBB 4 Z(( 4333	 rt   )rN  r6  foreign_key_constraintsr`  r]   extend_sorted_constraintsrB   )r   ra   rL  r`  all_fkcsrd  s   ``   @rr   rR  z$DDLCompiler.create_table_constraints  s      	2u01110+7 ++,LMMIII    2  	
 	
 	
 }} 
 
   "-  
 
 
 
 
 	
rt   c                 F    d| j                             |j                  z   S )Nz
DROP TABLE r   r  r   r   rF  s     rr   visit_drop_tablezDDLCompiler.visit_drop_table  s    !;!;DL!I!IIIrt   c                 F    d| j                             |j                  z   S )Nz
DROP VIEW rp  rq  s     rr   visit_drop_viewzDDLCompiler.visit_drop_view  s     : :4< H HHHrt   c                 L    |j         t          j        d|j        z            d S )Nz,Index '%s' is not associated with any table.)ra   r   r{  r   r   r  s     rr   _verify_index_tablezDDLCompiler._verify_index_table  s1    ;"AEJN   rt   Tc           
      d    |j         }                     |            j        }d}|j        r|dz  }|j        t          j        d          |d                     ||          d|                    |j	        |          dd	
                     fd
|j        D                       dz  }|S )NzCREATE zUNIQUE z0CREATE INDEX requires that the index have a namezINDEX include_schemar  r   (r   c              3   R   K   | ]!}j                             |d d          V  "dS )FTr  rm  N)r   r   )rp   r  r   s     rr   rG  z1DDLCompiler.visit_create_index.<locals>.<genexpr>  sX          !))T *       rt   rd  )r   rw  r   rg   r   r   r{  _prepared_index_namer  ra   rB   expressions)r   r"   rz  include_table_schemar  r   r  s   `      rr   visit_create_indexzDDLCompiler.visit_create_index  s      '''=< 	ID:"B   	%%eN%KKKK!!(< "     II     "-	      
 	
 rt   c                 z    |j         }|j        t          j        d          d|                     |d          z   S )Nz.DROP INDEX requires that the index have a namez
DROP INDEX Try  )r   r   r   r{  r  )r   rF  r  s      rr   visit_drop_indexzDDLCompiler.visit_drop_index  sT    :"@   !:!:$ "; "
 "
 
 	
rt   c                     |j          | j                            |j                   }nd }|r|r| j                            |          }nd }| j                            |          }|r|dz   |z   }|S Nr  )ra   r   r  r  format_index)r   r  rz  r  schema_name
index_names         rr   r  z DDLCompiler._prepared_index_name  s    ;"#}>>u{KK# 	. 	-445EFFKKK]//66
 	8$s*Z7Jrt   c                     d| j                             |j        j                  d|                     |j                  S )NALTER TABLE z ADD )r   r  r   ra   r   r   r"   s     rr   visit_add_constraintz DDLCompiler.visit_add_constraint  s@     M&&v~';<<<<LL(((
 	
rt   c                     d| j                             |j                  d| j                            |j        j        t          j                              S )NzCOMMENT ON TABLE r   )r   r  r   r   r  commentr
   Stringr  s     rr   visit_set_table_commentz#DDLCompiler.visit_set_table_comment  sV     M&&v~666622&(9(9  
 	
rt   c                 F    d| j                             |j                  z  S )NzCOMMENT ON TABLE %s IS NULLrp  rq  s     rr   visit_drop_table_commentz$DDLCompiler.visit_drop_table_comment  s(    ,t}/I/IL0
 0
 
 	
rt   c                     d| j                             |j        dd          d| j                            |j        j        t          j                              S )NzCOMMENT ON COLUMN T)	use_tabler  r   )r   r  r   r   r  r  r
   r  r  s     rr   visit_set_column_commentz$DDLCompiler.visit_set_column_comment   sj     M''$4 (     22&(9(9  	
 	
rt   c                 J    d| j                             |j        d          z  S )NzCOMMENT ON COLUMN %s IS NULLT)r  )r   r  r   rq  s     rr   visit_drop_column_commentz%DDLCompiler.visit_drop_column_comment
  s0    -0K0KLD 1L 1
 1
 
 	
rt   c                    d| j                             |j                  z  }|j        j        |d|j        j        z  z  }|j        j        |d|j        j        z  z  }|j        j        |d|j        j        z  z  }|j        j        |d|j        j        z  z  }|j        j        |dz  }|j        j        |dz  }|j        j	        |d|j        j	        z  z  }|j        j
        d	u r|d
z  }|j        j        |dz  }|S )NzCREATE SEQUENCE %sz INCREMENT BY %dz START WITH %dz MINVALUE %dz MAXVALUE %dz NO MINVALUEz NO MAXVALUEz	 CACHE %dTz ORDERz CYCLE)r   r!  r   	incrementstartminvaluemaxvalue
nominvalue
nomaxvaluecacherT   cycle)r   r"   r  s      rr   visit_create_sequencez!DDLCompiler.visit_create_sequence  s"   #dm&C&CN'
 '
 
 >#/&)AAAD>+$v~';;;D>".NV^%<<<D>".NV^%<<<D>$0N"D>$0N"D>+K&."666D>4''HD>+HDrt   c                 F    d| j                             |j                  z  S )NzDROP SEQUENCE %s)r   r!  r   rq  s     rr   visit_drop_sequencezDDLCompiler.visit_drop_sequence'  s    !DM$A$A$,$O$OOOrt   c                     |j         }|j        | j                            |          }nd }|t	          j        d|j         z            d| j                            |j         j                  d||j        rdpdS )Nz<Can't emit DROP CONSTRAINT for constraint %r; it has no namer  z DROP CONSTRAINT rD  r   )	r   r   r   format_constraintr   r{  r  ra   rE  )r   rF  r!   formatted_names       rr   visit_drop_constraintz!DDLCompiler.visit_drop_constraint*  s    \
?&!]<<ZHHNN!N!"!#'<0   " M&&t|'9::::NL'Z-2-
 	
rt   c                 2   | j                             |          dz   | j        j                            |j        |          z   }|                     |          }||d|z   z  }|j         |d|                     |j                  z   z  }|j        s|dz  }|S )Nr  )r  z	 DEFAULT z	 NOT NULL)	r   r  r   r  r   r   get_column_default_stringcomputednullable)r   r    r   colspecr)   s        rr   r_  z$DDLCompiler.get_column_specification<  s    M''//l(00V 1   	 0088{W,,G?&sT\\&/::::G 	#{"Grt   c                     dS Nr   rn   r   ra   s     rr   rM  zDDLCompiler.create_table_suffixO      rrt   c                     dS r  rn   r  s     rr   rT  zDDLCompiler.post_create_tableR  r  rt   c                 6   t          |j        t          j                  ryt          |j        j        t
          j                  r/| j                            |j        j        t          j
                  S | j                            |j        j        d          S d S )NT)rm  )r  server_defaultr   DefaultClauseargr   string_typesr   r  r
   r  r   r  s     rr   r  z%DDLCompiler.get_column_default_stringU  s    f+V-ABB 
	&/3T5FGG (==)-x/B   (00)-T 1    4rt   c                     d}|j         $| j                            |          }||d|z  z  }|d| j                            |j        dd          z  z  }||                     |          z  }|S Nr   CONSTRAINT %s z
CHECK (%s)FTr~  r   r   r  r   r   r!  define_constraint_deferrabilityr   r!   r  r  s       rr   visit_check_constraintz"DDLCompiler.visit_check_constraintb      ?&!]<<ZHHN)(>99t088e4  9  
  
 
 	
 	44Z@@@rt   c                     d}|j         $| j                            |          }||d|z  z  }|d| j                            |j        dd          z  z  }||                     |          z  }|S r  r  r  s       rr   visit_column_check_constraintz)DDLCompiler.visit_column_check_constraintn  r  rt   c                 :    t          |          dk    rdS d}|j        $ j                            |          }||d|z  z  }|dz  }|dd                     fd|j        r|j        n|j        D                       z  z  }|                     |          z  }|S )Nr   r   r  zPRIMARY KEY r  r   c              3   V   K   | ]#}j                             |j                  V  $d S r   r   r  r   r%  s     rr   rG  z;DDLCompiler.visit_primary_key_constraint.<locals>.<genexpr>  sI       #
 #
 M''#
 #
 #
 #
 #
 #
rt   )	rO  r   r   r  rB   _implicit_generatedcolumns_autoinc_firstr'  r  r  s   `   rr   visit_primary_key_constraintz(DDLCompiler.visit_primary_key_constraintz  s    z??a2?&!]<<ZHHN)(>99 #
 #
 #
 #
 1(
00'#
 #
 #
 
 
 
 	
 	44Z@@@rt   c           
          | j         d}|j        $| j                             |          }||d|z  z  }t          |j                  d         j        j        }|dd                    fd|j        D                       d|                     ||          dd                    fd	|j        D                       d
z  }|| 	                    |          z  }|| 
                    |          z  }||                     |          z  }|S )Nr   r  r   zFOREIGN KEY(r   c              3   V   K   | ]#}                     |j        j                  V  $d S r   )r  parentr   rp   r  r   s     rr   rG  z;DDLCompiler.visit_foreign_key_constraint.<locals>.<genexpr>  D        23qx}--     rt   z) REFERENCES r|  c              3   V   K   | ]#}                     |j        j                  V  $d S r   )r  r    r   r  s     rr   rG  z;DDLCompiler.visit_foreign_key_constraint.<locals>.<genexpr>  r  rt   rd  )r   r   r  r(  r   r    ra   rB   define_constraint_remote_tabledefine_constraint_matchdefine_constraint_cascadesr  )r   r!   r  r  remote_tabler   s        @rr   visit_foreign_key_constraintz(DDLCompiler.visit_foreign_key_constraint  sm   =?&!]<<ZHHN)(>99J/003:@II    7A7J       //L(    II    7A7J      

 
	
 	,,Z888//
;;;44Z@@@rt   c                 ,    |                     |          S )z=Format the remote table clause of a CREATE CONSTRAINT clause.)r  )r   r!   ra   r   s       rr   r  z*DDLCompiler.define_constraint_remote_table  s     $$U+++rt   c                 
    t          |          dk    rdS d}|j        $ j                            |          }||d|z  z  }|dd                     fd|D                       z  z  }|                     |          z  }|S )Nr   r   r  zUNIQUE (%s)r   c              3   V   K   | ]#}j                             |j                  V  $d S r   r  r%  s     rr   rG  z6DDLCompiler.visit_unique_constraint.<locals>.<genexpr>  s5      FFadm))!&11FFFFFFrt   )rO  r   r   r  rB   r  r  s   `   rr   visit_unique_constraintz#DDLCompiler.visit_unique_constraint  s    z??a2?&!]<<ZHHN)(>99IIFFFF:FFFFF
 	
 	44Z@@@rt   c                     d}|j         +|d| j                            |j         t                    z  z  }|j        +|d| j                            |j        t
                    z  z  }|S )Nr   z ON DELETE %sz ON UPDATE %s)ondeleter   validate_sql_phraseFK_ON_DELETEonupdateFK_ON_UPDATEr   r!   r  s      rr   r  z&DDLCompiler.define_constraint_cascades  s|    *Odm&G&G#\' '  D *Odm&G&G#\' '  D rt   c                     d}|j         |j         r|dz  }n|dz  }|j        +|d| j                            |j        t                    z  z  }|S )Nr   z DEFERRABLEz NOT DEFERRABLEz INITIALLY %s)r*   r<   r   r  FK_INITIALLYr  s      rr   r  z+DDLCompiler.define_constraint_deferrability  so     ,$ *%))+Odm&G&G$l' '  D rt   c                 2    d}|j         |d|j         z  z  }|S )Nr   z	 MATCH %s)matchr  s      rr   r  z#DDLCompiler.define_constraint_match  s'    'K*"222Drt   c                     d| j                             |j        dd          z  }|j        du r|dz  }n|j        du r|dz  }|S )NzGENERATED ALWAYS AS (%s)FTr~  z STOREDz VIRTUAL)r   r   r!  	persisted)r   	generatedr  s      rr   visit_computed_columnz!DDLCompiler.visit_computed_column  sj    )D,=,E,EU$ -F -
 -
 
 $&&IDD E))JDrt   r   r	  )FT)*r   r   r   r   r  r   r  r   r?  rB  rG  rZ  ra  rR  rr  rt  rw  r  r  r  r  r  r  r  r  r  r  r  r_  rM  rT  r  r  r  r  r  r  r  r  r  r  r  rn   rt   rr   r0  r0    s       	
 
 

 
* * *   L L L&) ) )  0 0 0d     7;'
 '
 '
 '
RJ J JI I I   BF   6	
 	
 	
    
 
 

 
 

 
 


 
 

 
 

  0P P P
 
 
$  &      
 
 

 
 
  (  0, , ,
  
 
 
        rt   r0  c                   
   e 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d 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d 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'd& Z(d' Z)d( Z*d) Z+d* Z,d+S ),GenericTypeCompilerc                     dS )NFLOATrn   r   s      rr   visit_FLOATzGenericTypeCompiler.visit_FLOAT      wrt   c                     dS )NREALrn   r   s      rr   
visit_REALzGenericTypeCompiler.visit_REAL  r  rt   c                 ^    |j         dS |j        dd|j         iz  S d|j         |j        dz  S )NNUMERICzNUMERIC(%(precision)s)	precisionz!NUMERIC(%(precision)s, %(scale)s)r  scaler  r   s      rr   visit_NUMERICz!GenericTypeCompiler.visit_NUMERIC  J    ?"9[ +{EO.LLL6"_: :  rt   c                 ^    |j         dS |j        dd|j         iz  S d|j         |j        dz  S )NDECIMALzDECIMAL(%(precision)s)r  z!DECIMAL(%(precision)s, %(scale)s)r  r  r   s      rr   visit_DECIMALz!GenericTypeCompiler.visit_DECIMAL  r  rt   c                     dS )NINTEGERrn   r   s      rr   visit_INTEGERz!GenericTypeCompiler.visit_INTEGER       yrt   c                     dS )NSMALLINTrn   r   s      rr   visit_SMALLINTz"GenericTypeCompiler.visit_SMALLINT      zrt   c                     dS )NBIGINTrn   r   s      rr   visit_BIGINTz GenericTypeCompiler.visit_BIGINT  s    xrt   c                     dS )N	TIMESTAMPrn   r   s      rr   visit_TIMESTAMPz#GenericTypeCompiler.visit_TIMESTAMP	  s    {rt   c                     dS )NDATETIMErn   r   s      rr   visit_DATETIMEz"GenericTypeCompiler.visit_DATETIME  r   rt   c                     dS )NDATErn   r   s      rr   
visit_DATEzGenericTypeCompiler.visit_DATE  r  rt   c                     dS )NTIMErn   r   s      rr   
visit_TIMEzGenericTypeCompiler.visit_TIME  r  rt   c                     dS )NCLOBrn   r   s      rr   
visit_CLOBzGenericTypeCompiler.visit_CLOB  r  rt   c                     dS )NNCLOBrn   r   s      rr   visit_NCLOBzGenericTypeCompiler.visit_NCLOB  r  rt   c                 Z    |}|j         r|d|j         z  z  }|j        r|d|j        z  z  }|S )N(%d)z COLLATE "%s")lengthr  )r   r   r   r  s       rr   _render_string_typez'GenericTypeCompiler._render_string_type  sB    < 	*FU\))D? 	6Oeo55Drt   c                 .    |                      |d          S )NCHARr  r   s      rr   
visit_CHARzGenericTypeCompiler.visit_CHAR$      ''v666rt   c                 .    |                      |d          S )NNCHARr  r   s      rr   visit_NCHARzGenericTypeCompiler.visit_NCHAR'  s    ''w777rt   c                 .    |                      |d          S )NVARCHARr  r   s      rr   visit_VARCHARz!GenericTypeCompiler.visit_VARCHAR*  s    ''y999rt   c                 .    |                      |d          S )NNVARCHARr  r   s      rr   visit_NVARCHARz"GenericTypeCompiler.visit_NVARCHAR-  s    ''z:::rt   c                 .    |                      |d          S )NTEXTr  r   s      rr   
visit_TEXTzGenericTypeCompiler.visit_TEXT0  r  rt   c                     dS )NBLOBrn   r   s      rr   
visit_BLOBzGenericTypeCompiler.visit_BLOB3  r  rt   c                 .    d|j         r
d|j         z  pdz   S )NBINARYr  r   r  r   s      rr   visit_BINARYz GenericTypeCompiler.visit_BINARY6  s     5<AFU\,AGRHHrt   c                 .    d|j         r
d|j         z  pdz   S )N	VARBINARYr  r   r0  r   s      rr   visit_VARBINARYz#GenericTypeCompiler.visit_VARBINARY9  s     elDv/DJKKrt   c                     dS )NBOOLEANrn   r   s      rr   visit_BOOLEANz!GenericTypeCompiler.visit_BOOLEAN<  r  rt   c                      | j         |fi |S r   )r-  r   s      rr   visit_large_binaryz&GenericTypeCompiler.visit_large_binary?      tu+++++rt   c                      | j         |fi |S r   )r7  r   s      rr   visit_booleanz!GenericTypeCompiler.visit_booleanB      !t!%..2...rt   c                      | j         |fi |S r   )r  r   s      rr   
visit_timezGenericTypeCompiler.visit_timeE  r:  rt   c                      | j         |fi |S r   )r	  r   s      rr   visit_datetimez"GenericTypeCompiler.visit_datetimeH      "t"5//B///rt   c                      | j         |fi |S r   )r  r   s      rr   
visit_datezGenericTypeCompiler.visit_dateK  r:  rt   c                      | j         |fi |S r   )r  r   s      rr   visit_big_integerz%GenericTypeCompiler.visit_big_integerN  s     t --"---rt   c                      | j         |fi |S r   )r  r   s      rr   visit_small_integerz'GenericTypeCompiler.visit_small_integerQ  rB  rt   c                      | j         |fi |S r   )r  r   s      rr   visit_integerz!GenericTypeCompiler.visit_integerT  r=  rt   c                      | j         |fi |S r   )r  r   s      rr   
visit_realzGenericTypeCompiler.visit_realW  r:  rt   c                      | j         |fi |S r   )r  r   s      rr   visit_floatzGenericTypeCompiler.visit_floatZ  s    t,,,,,rt   c                      | j         |fi |S r   )r  r   s      rr   visit_numericz!GenericTypeCompiler.visit_numeric]  r=  rt   c                      | j         |fi |S r   r$  r   s      rr   visit_stringz GenericTypeCompiler.visit_string`  r=  rt   c                      | j         |fi |S r   rR  r   s      rr   visit_unicodez!GenericTypeCompiler.visit_unicodec  r=  rt   c                      | j         |fi |S r   r*  r   s      rr   
visit_textzGenericTypeCompiler.visit_textf  r:  rt   c                      | j         |fi |S r   rW  r   s      rr   visit_unicode_textz&GenericTypeCompiler.visit_unicode_texti  r:  rt   c                      | j         |fi |S r   rR  r   s      rr   
visit_enumzGenericTypeCompiler.visit_enuml  r=  rt   c                 0    t          j        d|z            )NzKCan't generate DDL for %r; did you forget to specify a type on this Column?r  r   s      rr   r  zGenericTypeCompiler.visit_nullo  s$    #%*+
 
 	
rt   c                 N     | j         |                    | j                  fi |S r   )r   type_enginer   r   s      rr   visit_type_decoratorz(GenericTypeCompiler.visit_type_decoratorv  s,    t|E--dl;;BBrBBBrt   c                      |j         di |S )Nrn   )get_col_specr   s      rr   visit_user_definedz&GenericTypeCompiler.visit_user_definedy  s    !u!''B'''rt   N)-r   r   r   r  r  r  r  r  r  r  r  r	  r  r  r  r  r  r  r!  r$  r'  r*  r-  r1  r4  r7  r9  r<  r?  rA  rD  rF  rH  rJ  rL  rN  rP  rS  rU  rX  rZ  r\  r  r`  rc  rn   rt   rr   r  r    s           	 	 		 	 	                    7 7 78 8 8: : :; ; ;7 7 7  I I IL L L  , , ,/ / /, , ,0 0 0, , ,. . .0 0 0/ / /, , ,- - -/ / // / // / /, , ,, , ,/ / /
 
 
C C C( ( ( ( (rt   r  c                       e Zd Zd Zd ZdS )StrSQLTypeCompilerc                 X    |                     d          r| j        S t          |          )NrE  )
startswith_visit_unknownAttributeError)r   r  s     rr   __getattr__zStrSQLTypeCompiler.__getattr__~  s-    >>(## 	&&& %%%rt   c                      d|j         j        z  S )Nz%s)r"  r   r   s      rr   rh  z!StrSQLTypeCompiler._visit_unknown  s    eo...rt   N)r   r   r   rj  rh  rn   rt   rr   re  re  }  s2        & & &/ / / / /rt   re  c                   4   e Zd ZdZeZeZeZ	 e
j        d          Z	 	 	 	 	 ddZd Zd Zd	 Zd
 Zd Zd Zd ZddZddZd Zd dZddZddZddZ ej        d          d             Zd Zd!dZ d Z!	 	 	 	 d"dZ"d dZ#ej$        d             Z%d Z&dS )#IdentifierPreparerz@Handle quoting and case-folding of identifiers based on options.N"TFc                     || _         || _        |p| j        | _        || _        | j        dz  | _        || _        || _        i | _        | j         j        dv | _	        dS )as  Construct a new ``IdentifierPreparer`` object.

        initial_quote
          Character that begins a delimited identifier.

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

        omit_schema
          Prevent prepending schema name. Useful for databases that do
          not support schemae.
        r   )rz   rx   N)
r   initial_quotefinal_quoteescape_quoteescape_to_quoteomit_schemaquote_case_sensitive_collations_stringsr  r  )r   r   rp  rq  rr  ru  rt  s          rr   r   zIdentifierPreparer.__init__  so    . *&<$*<(#014&/N, $ 7 <
 !
rt   c                     | j                             | j                   }|j                            | j                   t	          j        |          |_        |S r   )r"  __new____dict__r  r   _schema_getterr  )r   r   preps      rr   r   z)IdentifierPreparer._with_schema_translate  sJ    ~%%dn55T]+++!'!67K!L!Lrt   c                     |                     | j        | j                  }| j        r|                     dd          }|S )zEscape an identifier.

        Subclasses should override this to provide database-dependent
        escaping behavior.
        r  r  )r  rr  rs  r  r   r	  s     rr   _escape_identifierz%IdentifierPreparer._escape_identifier  s@     d/1EFF  	-MM#t,,Ert   c                 B    |                     | j        | j                  S )zCanonicalize an escaped identifier.

        Subclasses should override this to provide database-dependent
        unescaping behavior that reverses _escape_identifier.
        )r  rs  rr  r}  s     rr   _unescape_identifierz'IdentifierPreparer._unescape_identifier  s     }}T143DEEErt   c                 t    |5|                     |          s t          j        d|d|j        d          |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: z (matching against rd  )r  r   r{  pattern)r   r   regs      rr   r  z&IdentifierPreparer.validate_sql_phrase  sN     syy'9'9""77CKKK)   rt   c                 L    | j         |                     |          z   | j        z   S )z~Quote an identifier.

        Subclasses should override this to provide database-dependent
        quoting behavior.
        )rp  r~  rq  r}  s     rr   quote_identifierz#IdentifierPreparer.quote_identifier  s0     %%e,,-	
rt   c                     |                                 }|| j        v pA|d         | j        v p2| j                            t          j        |                     p||k    S )z5Return True if the given identifier requires quoting.r   )r   reserved_wordsillegal_initial_characterslegal_charactersr  r   	text_type)r   r	  lc_values      rr   r  z#IdentifierPreparer._requires_quotes  sh    ;;==++ #Qx4::#(..t~e/D/DEEE# E!		
rt   c                 \    | j                             t          j        |                     S )zjReturn True if the given identifier requires quoting, but
        not taking case convention into account.)r  r  r   r  r}  s     rr   r  z1IdentifierPreparer._requires_quotes_illegal_chars  s(     (..t~e/D/DEEEErt   c                 X    |t          j        d           |                     |          S )a  Conditionally quote a schema name.


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

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

        :param schema: string schema name
        :param force: unused

            .. deprecated:: 0.9

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

        NzThe IdentifierPreparer.quote_schema.force parameter is deprecated and will be removed in a future release.  This flag has no effect on the behavior of the IdentifierPreparer.quote method; please refer to quoted_name().)r   warn_deprecatedr  )r   r   forces      rr   r  zIdentifierPreparer.quote_schema  s:    .   !   zz&!!!rt   c                 F   |t          j        d           t          |dd          }|`|| j        v r| j        |         S |                     |          r|                     |          | j        |<   n
|| j        |<   | j        |         S |r|                     |          S |S )a  Conditionally quote an identfier.

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

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

        :param ident: string identifier
        :param force: unused

            .. deprecated:: 0.9

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

        NzThe IdentifierPreparer.quote.force parameter is deprecated and will be removed in a future release.  This flag has no effect on the behavior of the IdentifierPreparer.quote method; please refer to quoted_name().r  )r   r  r  rv  r  r  )r   r  r  s      rr   r  zIdentifierPreparer.quote&  s    ,   !   w--=%%}U++((// 1+/+@+@+G+GDM%((+0DM%(}U++ 	((///Lrt   c                 >    | j         r|                     |          S |S r   )ru  r  )r   collation_names     rr   r  z#IdentifierPreparer.format_collationX  s%    / 	"::n---!!rt   c                     |                      |j                  }|                     |          }| j        s|r||                     |          dz   |z   }|S r  )r  r   r  rt  r  )r   r*  r  r   r  s        rr   r!  z"IdentifierPreparer.format_sequence^  sk    zz(-((11(;;  	D	D !,$$%566<tCDrt   c                 :    |                      |p|j                  S r   r  r   )r   r   r   s      rr   r  zIdentifierPreparer.format_labelk      zz$,%*---rt   c                 :    |                      |p|j                  S r   r  )r   r  r   s      rr   r  zIdentifierPreparer.format_aliasn  r  rt   c                 l    |p|j         }|                     |          r|                     |          }|S r   )r  r  r  )r   	savepointr   r  s       rr   r  z#IdentifierPreparer.format_savepointq  s>     '	  '' 	1))%00Ert   zsqlalchemy.sql.namingc                 N   t          |j        t          j                  rF|                    ||j                  }|(t          |j        t          j                  rd S |j        }n|j        }t          |t          j                  rq|j        dk    r| j	        j
        p| j	        j        }n| j	        j        }t          |          |k    r-|d|dz
           dz   t          j        |          dd          z   }n| j	                            |           |                     |          S )Nr  r      r  )r  r   r   _defer_name_constraint_name_for_tablera   _defer_none_namer  r   r   max_index_name_lengthr  rO  r   md5_hexvalidate_identifierr  )r   namingr!   r   max_s        rr   r  z$IdentifierPreparer.format_constraintz  s   jox';<< 	#44J, D |jox/HII +4%?D?DdH566 	3(G33L6 :|9 
 |94yy4AqL)C/$,t2D2DRSS2IIL,,T222zz$rt   c                 ,    |                      |          S r   )r  rv  s     rr   r  zIdentifierPreparer.format_index  s    %%e,,,rt   c                     ||j         }|                     |          }|                     |          }| j        s|r|r|                     |          dz   |z   }|S )z'Prepare a quoted table and schema name.Nr  )r   r  r  rt  r  )r   ra   r  r   r_  r  s         rr   r  zIdentifierPreparer.format_table  su     <:DD!!11%88 	HJ 	H3C 	H&&'7883>GFrt   c                 ,    |                      |          S )zPrepare a quoted schema name.)r  r  s     rr   rA  z IdentifierPreparer.format_schema  s     zz$rt   c                    ||j         }t          |dd          sM|r6|                     |j        ||          dz   |                     |          z   S |                     |          S |r#|                     |j        ||          dz   |z   S |S )zPrepare a quoted column name.Nr  F)r  r   r  )r   r  r  ra   r  )r   r    r  r   
table_namer  s         rr   r  z IdentifierPreparer.format_column  s     <;Dv|U33 	 	(%%* &    jj&&	' zz$'''
  	%%* &    	 rt   c                     |                      |          }| j        s0|r.|r,|                     |          |                     |d          fS |                     |d          fS )z(Format table name and schema as a tuple.Fr{  )r  rt  r  r  )r   ra   r  r  s       rr   r:  z#IdentifierPreparer.format_table_seq  s      11%88 	AJ 	A3C 	A!!"233!!%E!:: 
 %%e%>>@@rt   c                     d | j         | j        |                     | j                  fD             \  }}}t          j        d|||dz            }|S )Nc                 6    g | ]}t          j        |          S rn   )rC  r  r  s     rr   r  z5IdentifierPreparer._r_identifiers.<locals>.<listcomp>  s0     )
 )
 )
 IaLL)
 )
 )
rt   zM(?:(?:%(initial)s((?:%(escaped)s|[^%(final)s])+)%(final)s|([^\.]+))(?=\.|$))+)initialfinalescaped)rp  rq  r~  rC  r   )r   r  r  escaped_finalrs        rr   _r_identifiersz!IdentifierPreparer._r_identifiers  s    )
 )
 " ''(899)
 )
 )
% J$ "EmLLM
 
 rt   c                 h      j         } fdd |                    |          D             D             S )z:Unpack 'schema.table.column'-like strings into components.c                 :    g | ]}                     |          S rn   )r  )rp   r5  r   s     rr   r  z;IdentifierPreparer.unformat_identifiers.<locals>.<listcomp>  s7     
 
 
 %%a((
 
 
rt   c                     g | ]	\  }}|p|
S rn   rn   )rp   abs      rr   r  z;IdentifierPreparer.unformat_identifiers.<locals>.<listcomp>  s     @@@Aaf1@@@rt   )r  findall)r   identifiersr  s   `  rr   unformat_identifiersz'IdentifierPreparer.unformat_identifiers  sR     
 
 
 
@@;)?)?@@@
 
 
 	
rt   )rn  Nrn  TFr   )T)TN)FNNF)'r   r   r   r   RESERVED_WORDSr  LEGAL_CHARACTERSr  ILLEGAL_INITIAL_CHARACTERSr  r   rz  r  r   r   r~  r  r  r  r  r  r  r  r  r!  r  r  r  r   r  r  r  r  rA  r  r:  r  r  r  rn   rt   rr   rm  rm    s!       JJ#N'!;--d33
 (,"
 "
 "
 "
H  
 
 
F F F  $
 
 

 
 
F F F
#" #" #" #"J0 0 0 0d" " "   . . . .. . . .    T.//    0/ :- - -         $ $ $ $LA A A A" 
  "
 
 
 
 
rt   rm  )lr   r  rA  rC  r   r   r   r   r   r   r	   r
   r   r   r   r]   r  r   Ir  LEGAL_CHARACTERS_PLUS_SPACErangerf   r  r  r  r  UNICODEr  r  r  and_or_addmulrD  divmodtruedivnegltlenegtgeeqis_distinct_fromisnot_distinct_from	concat_opr\  notmatch_opin_opnotin_opcomma_opr  r  is_isnotr   existsdistinct_opinvany_opall_opdesc_opasc_opnullsfirst_opnullslast_opr  r   r$   r&   r'   r(   rG   rH   r   r   r\   rh   cuberollupgrouping_setsr!  r  r  r   	UNION_ALLr   
EXCEPT_ALLr   INTERSECT_ALLr  objectr   with_metaclassEnsureKWArgTyper   	Visitabler   rK  r   r  r  r0  r  re  rm  rn   rt   rr   <module>r     s$   $         				                                                             _ _ _a aF 2:.55 (bj):BDAA ;;eeArll;;;AA3%HH rz<bd  rz<bd  rz5rt<<bjA2:NN"*92:FF   )NG) M6) M5	)
 M5) M5) M5) M5) u) M3) L%) L&) L&) L%) L&)  L%!)"  4#)$ !#;%) )& ')( 	))* =+), OV-). 
/)0 1)2 OX3)4 M65)6 M67)8 OZ9): {;)> i?)@ ;A)B M6C)D fE)F fG)J wK) )L f^MQ) )	X 
NN!4N.hyNNFNFh_	$ ""$( & #W'$h(,'+_ J= J= J= J= J=v J= J= J=Z	4 	4 	4 	4 	4&4&t';VDD 	4 	4 	4    H&   0    d   $Q$
 Q$
 Q$
 Q$
 Q$
( Q$
 Q$
 Q$
hH? ? ? ? ?[ ? ? ?DK K K K K( K K K\W( W( W( W( W(, W( W( W(t/ / / / /, / / /u
 u
 u
 u
 u
 u
 u
 u
 u
 u
rt   