
b]c           @   s  d  Z  d d l Z d d l Z d d l Z d d l Z d d l m Z d d l m Z d d l m Z d d l m	 Z	 d d	 l m
 Z
 d d
 l m Z d d l m Z d d l m Z d d l m Z d d l m Z d d l m Z d d l m Z e j d e j e j B Z e j d e j e j B Z d e j f d     YZ d e f d     YZ d e j f d     YZ e e _ d S(   s  Default implementations of per-dialect sqlalchemy.engine classes.

These are semi-private implementation classes which are only of importance
to database dialect authors; dialects will usually use the classes here
as the base class for their own corresponding classes.

iNi   (   t
   interfaces(   t
   reflection(   t   resulti   (   t   event(   t   exc(   t   pool(   t
   processors(   t   types(   t   util(   t   compiler(   t
   expression(   t   schemas-   \s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER)s	   \s*SELECTt   DefaultDialectc           B   se  e  Z d  Z e j Z e j Z e j Z	 e j
 Z e Z e Z e Z d Z e Z e Z e Z e Z e Z e Z e Z e Z e Z e Z e Z e Z e Z e Z  e! j" d e! j# d  f d e! j$ f d e! j# d  f d e! j# d  f d e! j$ f d	 e! j$ f d
 e! j$ f d e! j% f g  Z& e Z' e! j( rGe Z) e Z* e Z+ d6 Z- n e Z) e Z* e Z+ d Z- d Z. d Z/ d6 Z0 d6 Z1 e Z2 e Z3 i  Z4 d Z5 e Z6 e Z7 e Z8 e Z9 d6 Z: d6 Z; e Z< d7 Z= e! j"   Z> e! j? d d8  e d d6 d6 d6 d6 e d6 d d6 d6 d   Z@ e! jA d    ZB eC d    ZD eC d    ZE eF d    ZG d   ZH d   ZI d   ZJ d6 d  ZK d   ZL d   ZM d   ZN d6 d   ZO d!   ZP d"   ZQ d#   ZR d$   ZS d%   ZT d&   ZU d'   ZV d(   ZW d)   ZX d*   ZY e! jA d+    ZZ d,   Z[ d-   Z\ d.   Z] d/   Z^ d0   Z_ d6 d1  Z` d6 d2  Za d6 d3  Zb d4   Zc d5   Zd RS(9   s!   Default implementation of Dialecti   t   convert_unicodet   forcet   pool_timeoutt   echot   debugt	   echo_poolt   pool_recyclet	   pool_sizet   max_overflowt   pool_threadlocalt   use_encodingt   defaulti'  t   nameds   1.3s   The :paramref:`.create_engine.convert_unicode` parameter and corresponding dialect-level parameters are deprecated, and will be removed in a future release.  Modern DBAPIs support Python Unicode natively and this parameter is unnecessary.s   utf-8t   staticc         K   s  t  |  d t  s) t j d |  j  n  | |  _ | |  _ t |  _ d  |  _
 | |  _ | d  k	 rn | |  _ n- |  j d  k	 r |  j j |  _ n |  j |  _ | d  k	 r | |  _ n  |  j d k |  _ |  j |   |  _ |  j |   |  _ | d  k	 r| |  _ n  | d  k	 r| |  _ n  | |  _ |	 |  _ |	 d k rCt |  _ n6 |	 d k rjt |  _ |	 d k |  _ n t j d	   |
 |  _ |  j r|  j |  _ n  | |  _ |  j d
 k rt j |  |  _  n' |  j d  k	 rt j |  j  |  _  n  t! j" |  j  |  _# t j |  j  |  _$ d  S(   Nt   ported_sqla_06s2   The %s dialect is not yet ported to the 0.6 formatt   qmarkt   formatt   numericR   t   dynamict   dynamic_warns?   empty_in_strategy may be 'static', 'dynamic', or 'dynamic_warn'R   (   R   R   R   (   R   R    (%   t   getattrt   TrueR   t   warnt   nameR   t   encodingt   Falset
   positionalt   Nonet   _ischemat   dbapit
   paramstylet   default_paramstylet   implicit_returningt   preparert   identifier_preparert   type_compilert   supports_right_nested_joinst   supports_native_booleant   case_sensitivet   empty_in_strategyt   _use_static_int   _warn_on_empty_inR   t   ArgumentErrort#   _user_defined_max_identifier_lengtht   max_identifier_lengtht   label_lengtht   description_encodingR   t   to_unicode_processor_factoryt   _description_decodert   codecst
   getencodert   _encodert   _decoder(   t   selfR   R%   R+   R*   R-   R1   R3   R2   R4   R9   R:   t   kwargs(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   __init__   sX    												c         C   s
   t  j   S(   N(   t   weakreft   WeakKeyDictionary(   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   _type_memos  s    c         C   s   |  j  d |  j S(   Nt   +(   R$   t   driver(   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   dialect_description  s    c         C   s   |  j  S(   N(   t   supports_sane_rowcount(   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt    supports_sane_rowcount_returning  s    c         C   s   t  |  d t j  S(   Nt	   poolclass(   R!   R   t	   QueuePool(   t   clst   url(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   get_pool_class  s    c         C   sM  y |  j  |  |  _ Wn t k
 r2 d  |  _ n Xy |  j |  |  _ Wn t k
 re d  |  _ n Xy |  j | j  |  _ Wn t k
 r d  |  _ n X|  j	 |  |  _
 |  j d  k	 r |  j |  r d  |  _ |  _ n  |  j s|  j |  } | r| |  _ qn  |  j rI|  j |  j k rIt j d |  j |  j f   n  d  S(   NsQ   Label length of %d is greater than this dialect's maximum identifier length of %d(   t   _get_server_version_infot   server_version_infot   NotImplementedErrorR(   t   _get_default_schema_namet   default_schema_namet   get_isolation_levelt
   connectiont   default_isolation_levelt   _check_unicode_returnst   returns_unicode_stringsR;   t   _check_unicode_descriptionR=   R8   t   _check_max_identifier_lengthR9   R:   R   R7   (   RB   RX   t   max_ident_length(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt
   initialize!  s8    		c         C   s   d S(   s  return a callable which sets up a newly created DBAPI connection.

        This is used to set dialect-wide per-connection options such as
        isolation modes, unicode modes, etc.

        If a callable is returned, it will be assembled into a pool listener
        that receives the direct DBAPI connection, with all wrappers removed.

        If None is returned, no listener will be generated.

        N(   R(   (   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt
   on_connectM  s    c         C   s   d S(   s   Perform a connection / server version specific check to determine
        the max_identifier_length.

        If the dialect's class level max_identifier_length should be used,
        can return None.

        .. versionadded:: 1.3.9

        N(   R(   (   RB   RX   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR]   [  s    
c            s   t  j r  j r t  j   n	 t  j    j r@  j    n i        f d    t j t j	 d  t
 j d   t j t j	 d  t
 j d   g } | r | | 7} n   f d   | D } | j t t g  r d S| t h k Sd  S(   Nc            s     t  j |  g  j d    } y<  j j   }  j | |   | j   } | j   Wn( t j	 k
 r } t
 j d |  t SXt | d t
 j  Sd  S(   Nt   dialects2   Exception attempting to detect unicode returns: %ri    (   R
   t   selectt   compileRX   t   cursort   _cursor_executet   fetchonet   closeR   t
   DBAPIErrorR   R#   R&   t
   isinstancet	   text_type(   t   testt	   statementRd   t   rowt   de(   t   cast_toRX   t
   parametersRB   (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   check_unicoder  s    !s   'test plain returns'i<   s   'test unicode returns'c            s   h  |  ] }   |   q S(    (    (   t   .0Rk   (   Rq   (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pys	   <setcomp>  s   	 t   conditional(   R   t   py2kt   supports_unicode_statementst   binary_typeRj   R'   t   execute_sequence_formatR
   t   castt   literal_columnt   sqltypest   VARCHARt   Unicodet
   issupersetR"   R&   (   RB   RX   t   additional_testst   testst   results(    (   Ro   Rq   RX   Rp   RB   s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyRZ   g  s&    		c         C   s   t  j r |  j r t  j } n	 t  j } | j j   } z\ | j | t j	 t j
 d  j d  g  j d |     t | j d d t  j  SWd  | j   Xd  S(   Ns   'x't
   some_labelRa   i    (   R   Rt   Ru   Rv   Rj   RX   Rd   t   executeR
   Rb   Ry   t   labelRc   Ri   t   descriptionRg   (   RB   RX   Ro   Rd   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR\     s    	!c         C   s   t  j | |  j  S(   s)  Provide a database-specific :class:`.TypeEngine` object, given
        the generic object which comes from the types module.

        This method looks for a dictionary called
        ``colspecs`` as a class or instance-level variable,
        and passes on to :func:`.types.adapt_type`.

        (   Rz   t
   adapt_typet   colspecs(   RB   t   typeobj(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   type_descriptor  s    	c         K   s+   t  j j |  } | j | | | | |  S(   N(   R   t	   Inspectort   from_enginet   reflecttable(   RB   RX   t   tablet   include_columnst   exclude_columnst   resolve_fkst   optst   insp(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR     s    	c         K   s    i |  j  | | d | | d 6S(   s   Compatibility method, adapts the result of get_primary_keys()
        for those dialects which don't implement get_pk_constraint().

        R   t   constrained_columns(   t   get_primary_keys(   RB   t   connt
   table_nameR   t   kw(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   get_pk_constraint  s    c         C   s8   t  |  |  j k r4 t j d | |  j f   n  d  S(   Ns7   Identifier '%s' exceeds maximum length of %d characters(   t   lenR9   R   t   IdentifierError(   RB   t   ident(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   validate_identifier  s    c         O   s   |  j  j | |   S(   N(   R*   t   connect(   RB   t   cargst   cparams(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR     s    c         C   s&   | j    } | j | j  g  | g S(   N(   t   translate_connect_argst   updatet   query(   RB   RP   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   create_connect_args  s    c            s   d | k r= | d  t  j | d    f d    } n  d | k r t j | d      | _ t  j | d    f d    } n  d  S(   Nt   isolation_levelt   engine_connectc            s   | s  j  |     n  d  S(   N(   t   _set_connection_isolation(   RX   t   branch(   R   RB   (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   set_isolation  s    t   schema_translate_mapc            s     |  _  d  S(   N(   t   schema_for_object(   RX   R   (   t   getter(    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   set_schema_translate_map  s    (   R   t   listens_forR   t   _schema_getterR   (   RB   t   engineR   R   R   (    (   R   R   RB   s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   set_engine_execution_options  s    
'	c         C   sR   d | k r# |  j  | | d  n  d | k rN t j | d  } | | _ n  d  S(   NR   R   (   R   R   R   R   (   RB   RX   R   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt    set_connection_execution_options  s
    c         C   sL   | j    r t j d  n  |  j | j |  | j j j j |  j  d  S(   Ns   Connection is already established with a Transaction; setting isolation_level may implicitly rollback or commit the existing transaction, or have no effect until next transaction(	   t   in_transactionR   R#   t   set_isolation_levelRX   t   _connection_recordt   finalize_callbackt   appendt   reset_isolation_level(   RB   RX   t   level(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR     s    
c         C   s   d  S(   N(    (   RB   t   dbapi_connection(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   do_begin  s    c         C   s   | j    d  S(   N(   t   rollback(   RB   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   do_rollback  s    c         C   s   | j    d  S(   N(   t   commit(   RB   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt	   do_commit  s    c         C   s   | j    d  S(   N(   Rg   (   RB   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   do_close  s    c         C   s"   t  t j d g  j d |    S(   Ni   Ra   (   t   strR
   Rb   Rc   (   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   _dialect_specific_select_one  s    c         C   sx   d  } y2 | j   } z | j |  j  Wd  | j   XWn5 |  j j k
 ro } |  j | | |  ri t S  n Xt	 Sd  S(   N(
   R(   Rd   R   R   Rg   R*   t   Errort   is_disconnectR&   R"   (   RB   R   Rd   t   err(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   do_ping  s    c         C   s   d t  j d d  S(   s   Create a random two-phase transaction ID.

        This id will be passed to do_begin_twophase(), do_rollback_twophase(),
        do_commit_twophase().  Its format is unspecified.
        s	   _sa_%032xi    i   i   l	                    (   t   randomt   randint(   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt
   create_xid.  s    c         C   s   | j  t j |   d  S(   N(   R   R
   t   SavepointClause(   RB   RX   R$   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   do_savepoint7  s    c         C   s   | j  t j |   d  S(   N(   R   R
   t   RollbackToSavepointClause(   RB   RX   R$   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   do_rollback_to_savepoint:  s    c         C   s   | j  t j |   d  S(   N(   R   R
   t   ReleaseSavepointClause(   RB   RX   R$   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   do_release_savepoint=  s    c         C   s   | j  | |  d  S(   N(   t   executemany(   RB   Rd   Rl   Rp   t   context(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   do_executemany@  s    c         C   s   | j  | |  d  S(   N(   R   (   RB   Rd   Rl   Rp   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt
   do_executeC  s    c         C   s   | j  |  d  S(   N(   R   (   RB   Rd   Rl   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   do_execute_no_paramsF  s    c         C   s   t  S(   N(   R&   (   RB   t   eRX   Rd   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR   I  s    c         C   s   |  j  | |  j  d  S(   N(   R   RY   (   RB   t
   dbapi_conn(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR   L  s    N(    (   s   1.3s   The :paramref:`.create_engine.convert_unicode` parameter and corresponding dialect-level parameters are deprecated, and will be removed in a future release.  Modern DBAPIs support Python Unicode natively and this parameter is unnecessary.(e   t   __name__t
   __module__t   __doc__R	   t   SQLCompilert   statement_compilert   DDLCompilert   ddl_compilert   GenericTypeCompilerR0   t   IdentifierPreparerR.   R"   t   supports_alterR&   t   supports_commentst   inline_commentst   default_sequence_baset   tupleRw   t   supports_viewst   supports_sequencest   sequences_optionalt"   preexecute_autoincrement_sequencest   postfetch_lastrowidR-   R1   t   cte_follows_insertt   supports_native_enumR2   t#   non_native_boolean_check_constraintt   supports_simple_order_by_labelt   tuple_in_valuesR   t   immutabledictt   bool_or_strt   asintt   asboolt   engine_config_typest   supports_native_decimalt   py3kRu   t   supports_unicode_bindsR[   R(   R;   R$   R9   R8   t   max_index_name_lengthRK   t   supports_sane_multi_rowcountR   R,   t   supports_default_valuest   supports_empty_insertt   supports_multivalues_insertt   supports_server_side_cursorsRS   t   construct_argumentst   requires_name_normalizet   reflection_optionst   dbapi_exception_translation_mapt   deprecated_paramsRD   t   memoized_propertyRG   t   propertyRJ   RL   t   classmethodRQ   R_   R`   R]   RZ   R\   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR   +   s   						*		 >	,		7																				t   StrCompileDialectc           B   sP   e  Z e j Z e j Z e j Z e j	 Z
 e Z e Z e Z e Z e Z e Z RS(    (   R   R   R	   t   StrSQLCompilerR   R   R   t   StrSQLTypeCompilerR0   R   R.   R"   R   R   R&   R   R-   R2   R   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR  S  s   				t   DefaultExecutionContextc           B   s*  e  Z e Z e Z e Z e Z e Z e Z e Z	 d& Z d& Z d& Z d& Z e Z e Z d& Z e j   Z e d     Z e d    Z d   Z e d    Z e d    Z e j d    Z e j d    Z e j d    Z e j d    Z e j d	    Z  e j d
    Z! d   Z" e# d    Z$ d   Z% d   Z& d   Z' d   Z( d   Z) d   Z* d   Z+ d   Z, d   Z- d   Z. e# d    Z/ d   Z0 d   Z1 d   Z2 d   Z3 d   Z4 d   Z5 d   Z6 d& d& d& d  Z7 d    Z8 d& Z9 e: d!  Z; d"   Z< d#   Z= d$   Z> d%   Z? RS('   c         C   s  |  j  |   } | | _ | | _ | j | _ | | _ } t | _ | j | _ | j r t	 | j  | _ | j j
 | j  n  | j s t j |  | _ | j | j  d | _ n t j |  | _ | _ | j   | _ g  | _ | j r| j   g | _ n i  g | _ | S(   s8   Initialize execution context for a DDLElement construct.i    (   t   __new__t   root_connectiont   _dbapi_connectionRa   t   compiledR"   t   isddlt   execution_optionst   _execution_optionst   dictR   Ru   R   Rj   t   unicode_statementR@   Rl   t   create_cursorRd   t   compiled_parametersR'   Rw   Rp   (   RO   Ra   RX   R   t   compiled_ddlRB   R
  (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt	   _init_ddly  s(    							c            sQ  |  j  |   } | | _ | | _ | j | _ | | _ | j sE t  | j j | j	  | _ | j
 | j | j f | _ t j |  | _  j s | j j | j j  | _ n | j | _ | j | _ | j | _ | j | _ | j | _ | s| j   g | _ nL g  t |  D]! \ } } | j | d | ^ q| _ t |  d k | _ | j   | _  | j s~| j s~| j rt! | _" t# | j j$  | _% t# | j& o| j j$  | _' n  | j j( s| j j) r| j r| j*   q| j+   n  | j,  | j- r | j. |   }	 n | j/ r8| j j0 }	 n  g  } | j/ rx | j D]n   g  }
 xI |	 D]A } |  k r|
 j1  |   |   qd|
 j1   |  qdW| j1  j2 |
   qQWnu  j } xh | j D]]   | rt3     f d     D  }
 n t3    f d     D  }
 | j1 |
  qW j2 |  | _4 | S(   s6   Initialize execution context for a Compiled construct.t   _group_numberi   c         3   sL   |  ]B }  j  |  d  |  k r9  |   |  n   | f Vq d S(   i    N(   R@   (   Rr   t   key(   t   compiled_paramsRa   R   (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pys	   <genexpr>  s   c         3   s?   |  ]5 } | |  k r,  |   |  n   | f Vq d  S(   N(    (   Rr   R  (   R  R   (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pys	   <genexpr>  s   (5   R  R  R	  Ra   R
  t   can_executet   AssertionErrorR  t   unionR  t   _result_columnst   _ordered_columnst   _textual_ordered_columnst   result_column_structR   Rj   R  Ru   t   encodeR%   Rl   t   isinsertt   isupdatet   isdeletet   isplaintextt   is_textt   construct_paramsR  t	   enumerateR   R   R  Rd   R"   t   is_crudt   boolt
   _returningt   _is_explicit_returningt	   returningt   _is_implicit_returningt   insert_prefetcht   update_prefetcht   _process_executemany_defaultst   _process_executesingle_defaultst   _bind_processorst   contains_expanding_parameterst   _expand_in_parametersR'   t   positiontupR   Rw   R  Rp   (   RO   Ra   RX   R   R
  Rp   RB   t   grpt   mR3  t   paramR  R  (    (   R  Ra   R   s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   _init_compiled  sz    						4						
c            s   j  r t j d   n   j j rB  j j rB t d   n  i   _  j d } | j rj g  } n d } i   i  } xa| j r  j j
 n	  j j D]>   j j   } | j r   k r |    nt| j    } | s*g   |   < j j | j r| j n	 | j g     <n t | d t t f  rg  t | d  D]A \ } }	 t |	 d  D]% \ }
 } d   | |
 f | f ^ qlqS |   < j j rd n d d j   f d	   t |  D     <nc g  t | d  D]" \ } } d
   | f | f ^ q |   <d j  f d    D     <| j    j    f d    D  | j r| j d    D  n  g   D] \ } } | ^ q j   <q | j r | j    q q W f d   } t j d |  j   _ | S(   s   handle special 'expanding' parameters, IN tuples that are rendered
        on a per-parameter basis for an otherwise fixed SQL statement string.

        s7   'expanding' parameters can't be used with executemany()sQ   'expanding' bind parameters not supported with 'numeric' paramstyle at this time.i    i   s   %s_%s_%ss   VALUES t    s   , c         3   sG   |  ]= \    d  d j       f d   t   D  Vq d S(   s   (%s)s   , c         3   sB   |  ]8 \ } }  j  j i    t   | d  d 6Vq d S(   i    R$   N(   R
  t   bindtemplateR   (   Rr   t   jt   value(   t   iRB   t	   to_updatet   tuple_element(    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pys	   <genexpr>R  s   N(   t   joinR%  (   Rr   (   RB   R=  (   R<  R>  s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pys	   <genexpr>P  s   
s   %s_%sc         3   s,   |  ]" \ } }   j  j i | d  6Vq d S(   R$   N(   R
  R9  (   Rr   R  R;  (   RB   (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pys	   <genexpr>b  s   c         3   s1   |  ]' \ } }    k r |    f Vq d  S(   N(    (   Rr   R  R;  (   R$   R   (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pys	   <genexpr>h  s   	c         s   s   |  ] \ } } | Vq d  S(   N(    (   Rr   R$   R;  (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pys	   <genexpr>m  s    c            s     |  j  d  S(   Ni   (   t   group(   R5  (   t   replacement_expressions(    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   process_expandingt  s    s   \[EXPANDING_(\S+)\]N(   R   R   t   InvalidRequestErrorR
  R'   t   _numeric_bindsRT   t   _expanded_parametersR  R(   R3  t   bindst	   expandingt   popt   visit_empty_set_exprt   _expanding_in_typest   typeRi   R   t   listR%  Ra   R   R?  R   t   extendR   t   ret   subRl   (   RB   R
  R   R  R3  t   to_update_setst	   parametert   valuesR<  R>  R:  R;  t
   expand_keyRB  (    (   R$   R   RA  RB   R=  s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR2    sh    						C
=	)	c            s  |  j  |   } | | _ | | _ | j | _ t | _ | j | _ | sx | j j ri  j	   g | _
 q"i  g | _
 n t | d  j	  r | | _
 n t | d t  r  j r | | _
 q"g  | D]      f d     D ^ q p i  g | _
 n% g  | D] }  j	 |  ^ q| _
 t |  d k | _  j rut | t j  ru| | _  j |  d | _ n | | _ | _ | j   | _ | S(   s8   Initialize execution context for a string SQL statement.i    c            s*   i  |  ]  }   |  j  |  d   q S(   i    (   R@   (   Rr   t   k(   t   dRa   (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pys
   <dictcomp>  s   	 i   (   R  R  R	  Ra   R"   R#  R  R  R'   Rw   Rp   Ri   R  Ru   R   R   R   Rj   R  R@   Rl   R  Rd   (   RO   Ra   RX   R   Rl   Rp   RB   t   p(    (   RU  Ra   s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   _init_statement|  s6    				)%	c         C   sL   |  j  |   } | | _ | | _ | j | _ | j | _ | j   | _ | S(   s;   Initialize execution context for a ColumnDefault construct.(   R  R  R	  Ra   R  R  R  Rd   (   RO   Ra   RX   R   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   _init_default  s    		c         C   s
   |  j  j S(   N(   R  R   (   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR     s    c         C   s
   |  j  j S(   N(   R
  t	   postfetch(   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   postfetch_cols  s    c         C   s.   |  j  r |  j j S|  j r& |  j j Sd Sd  S(   N(    (   R  R
  R,  R   R-  (   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   prefetch_cols  s
    	
	
c         C   s   |  j  j d  S(   N(   R
  R*  (   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   returning_cols  s    c         C   s   |  j  j d t  S(   Nt   no_parameters(   R  t   getR&   (   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR]    s    c         C   sX   |  j  j d |  j r( |  j r( t j p+ t  } | t j k rP |  j |  j  S| Sd  S(   Nt
   autocommit(	   R  R^  R
  Rl   R
   t   PARSE_AUTOCOMMITR&   t   should_autocommit_textR  (   RB   R_  (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   should_autocommit  s    	
			c         C   s   |  j  } t | t j  rA |  j j rA |  j j |  d } n  |  j j r_ |  j j   } n i  } | j	 |  j
 | | d |  |  j
 j   d } | d k	 r | j |  j |  j
 j d d  } | r | |  Sn  | S(   s  Execute a string statement on the current cursor, returning a
        scalar result.

        Used to fire off sequences, default phrases, and "select lastrowid"
        types of statements individually or in the context of a parent INSERT
        or UPDATE statement.

        i    R   i   N(   R  Ri   R   Rj   Ra   Ru   R@   R'   Rw   Re   Rd   Rf   R(   t   _cached_result_processorR   (   RB   t   stmtt   type_R   t   default_paramst   rt   proc(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   _execute_scalar  s    
	c         C   s   |  j  j   S(   N(   R  t   _branch(   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyRX     s    c         C   s   t  j |  S(   N(   t   AUTOCOMMIT_REGEXPt   match(   RB   Rl   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyRa    s    c         C   s   |  j  j s t S|  j  j r |  j j d t  o |  j rR t |  j j	 t
 j  p |  j st t |  j j	 t
 j  o |  j	 o t j |  j	  } n |  j j d t  } | S(   Nt   stream_results(   Ra   R   R&   t   server_side_cursorsR  R^  R"   R
  Ri   Rl   R
   t
   Selectablet
   TextClauset   SERVER_SIDE_CURSOR_RERl  (   RB   t   use_server_side(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   _use_server_side_cursor  s     		
		c         C   s9   |  j    r t |  _ |  j   St |  _ |  j j   Sd  S(   N(   Rs  R"   t   _is_server_sidet   create_server_side_cursorR&   R	  Rd   (   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR  (  s
    	
	c         C   s   t     d  S(   N(   RT   (   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyRu  0  s    c         C   s   d  S(   N(    (   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   pre_exec3  s    c         C   s   d  S(   N(    (   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt	   post_exec6  s    c         C   s   | j  |  j |  S(   s   Return a 'result processor' for a given type as present in
        cursor.description.

        This has a default implementation that dialects can override
        for context-sensitive result type handling.

        (   Rc  Ra   (   RB   Re  t   colnamet   coltype(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   get_result_processor9  s    c         C   s
   |  j  j S(   s  return self.cursor.lastrowid, or equivalent, after an INSERT.

        This may involve calling special cursor functions,
        issuing a new SELECT on the cursor (or a new one),
        or returning a stored value that was
        calculated within post_exec().

        This function will only be called for dialects
        which support "implicit" primary key generation,
        keep preexecute_autoincrement_sequences set to False,
        and when no explicit id value was bound to the
        statement.

        The function is called once, directly after
        post_exec() and before the transaction is committed
        or ResultProxy is generated.   If the post_exec()
        method assigns a value to `self._lastrowid`, the
        value is used in place of calling get_lastrowid().

        Note that this method is *not* equivalent to the
        ``lastrowid`` method on ``ResultProxy``, which is a
        direct proxy to the DBAPI ``lastrowid`` accessor
        in all cases.

        (   Rd   t	   lastrowid(   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   get_lastrowidC  s    c         C   s   d  S(   N(    (   RB   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   handle_dbapi_exception_  s    c         C   s'   |  j  r t j |   St j |   Sd  S(   N(   Rt  R   t   BufferedRowResultProxyt   ResultProxy(   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   get_result_proxyb  s    	c         C   s
   |  j  j S(   N(   Rd   t   rowcount(   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR  h  s    c         C   s
   |  j  j S(   N(   Ra   RK   (   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyRK   l  s    c         C   s
   |  j  j S(   N(   Ra   R   (   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR   o  s    c         C   s8  |  j  r\ |  j r\ |  j rC |  j j rC |  j j rC |  j   q\ |  j s\ |  j   q\ n  |  j	   } |  j  r |  j r | j
   } | |  _ |  j |  | j   d  | _ q4|  j s4| j   d  | _ q4n` |  j r|  j r| j
   } | |  _ | j   d  | _ n# | j d  k r4| j | j   n  | S(   N(   R  R   R+  R
  t   inlineRa   R   t   _setup_ins_pk_from_lastrowidt   _setup_ins_pk_from_emptyR  Rf   t   returned_defaultst%   _setup_ins_pk_from_implicit_returningt   _soft_closeR(   t	   _metadataR)  R   R  (   RB   R   Rm   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   _setup_crud_result_proxyr  s6    
				
	
	
c         C   s
  |  j  j d } |  j  j j } |  j d } |  j   } | d  k	 r | j } | d  k	 r | j j	 |  j
 d   } | d  k	 r | |  } q n  g  | j D]0 } | | k r | n | j | |  d   ^ q |  _ n1 g  | j D] } | j | |  d   ^ q |  _ d  S(   Ni   i    (   R
  t   _key_getters_for_crud_columnRl   R   R  R|  R(   t   _autoincrement_columnRK  Rc  Ra   t   primary_keyR^  t   inserted_primary_key(   RB   t
   key_getterR   R  R{  t   autoinc_colRh  t   c(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR    s    		Cc         C   sa   |  j  j d } |  j  j j } |  j d } g  | j D] } | j | |  d   ^ q6 |  _ d  S(   Ni   i    (	   R
  R  Rl   R   R  R  R^  R(   R  (   RB   R  R   R  R  (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR    s    c         C   s   | d  k r d  |  _ d  S|  j j d } |  j j j } |  j d } g  g  | j D]$ } | | j | |  d   f ^ qR D]( \ } } | d  k r | | n | ^ qz |  _ d  S(   Ni   i    (	   R(   R  R
  R  Rl   R   R  R  R^  (   RB   Rm   R  R   R  t   colR;  (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR    s    	c         C   s"   |  j  s |  j o! t |  j j  S(   N(   R  R   R'  R
  RY  (   RB   (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   lastrow_has_defaults  s    c            s  t  |  j d  s d Si  } x |  j j D] } | j j |  j  } t |  } | j |  j j      d k	 r | s   | k r | | k r | s   | k s | | k r   | | <q) d | | <q) W|  j j	 r|  j j
 j | |  j |  j |  j |   n  |  j j rg  } x |  j j D]w }	 |  j j |	 } | j | d      d k	 r |	 |  j k r| j   g t |  j |	   q| j    q q Wy |  j j |   Wqt k
 r}
 |  j j |
 d d d |   qXni  } x |  j j j   D] \ } }	 | j | d      d k	 r| rB| j |	 |	  }	 n  |  j j sg|  j j |	  d }	 n  |	 |  j k r| j   f d   |  j |	 D  q  | |	 <qqWy |  j j |   Wn/ t k
 r}
 |  j j |
 d d d |   n Xd S(   s&  Given a cursor and ClauseParameters, call the appropriate
        style of ``setinputsizes()`` on the cursor, using DB-API types
        from the bind parameter's ``TypeEngine`` objects.

        This method only called by those dialects which require it,
        currently cx_oracle.

        t
   bind_namesNi    c         3   s   |  ] } |   f Vq d  S(   N(    (   Rr   RS  (   t   dbtype(    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pys	   <genexpr>  s   (   t   hasattrR
  R  RK  t   _unwrapped_dialect_implRa   t   get_dbapi_typeR*   R(   t   _has_eventst   dispatcht   do_setinputsizesRd   Rl   Rp   R'   R3  RF  R^  RE  RM  R   R   t   setinputsizest   BaseExceptionR  t   _handle_dbapi_exceptiont   itemsR   R@   R   (   RB   t	   translatet   include_typest   exclude_typest
   inputsizest	   bindparamt   dialect_implt   dialect_impl_clst   positional_inputsizesR  R   t   keyword_inputsizes(    (   R  s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   set_input_sizes  sh    		c         C   s   | j  r |  j | |  S| j r8 | |  _ | j |   S| j r |  j } | j sk t j	 | j |  } n	 | j } t j
 | g  j d |  } | j | d i   j   S| j Sd  S(   Nt   bind(    (   t   is_sequencet   fire_sequencet   is_callablet   current_columnt   argt   is_clause_elementRX   t   _arg_is_typedR
   t   type_coerceRb   Rc   t   _execute_compiledt   scalar(   RB   t   columnR   Re  R   t   default_argR  (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   _exec_default+  s    							c            s   y |  j   |  j } Wn  t k
 r8 t j d   n X| r |  j r |  j j j r | j	 r | j
 d   i  | j | j j 6} n i  | j | j 6} d   |  j j j d j   } | j    f d   | D  | S Sd S(   sF  Return a dictionary of parameters applied to the current row.

        This method can only be used in the context of a user-defined default
        generation function, e.g. as described at
        :ref:`context_default_functions`. When invoked, a dictionary is
        returned which includes entries for each column/value pair that is part
        of the INSERT or UPDATE statement. The keys of the dictionary will be
        the key value of each :class:`.Column`, which is usually synonymous
        with the name.

        :param isolate_multiinsert_groups=True: indicates that multi-valued
         INSERT constructs created using :meth:`.Insert.values` should be
         handled by returning only the subset of parameters that are local
         to the current column default invocation.   When ``False``, the
         raw parameters of the statement are returned including the
         naming convention used in the case of multi-valued INSERT.

        .. versionadded:: 1.2  added
           :meth:`.DefaultExecutionContext.get_current_parameters`
           which provides more functionality over the existing
           :attr:`.DefaultExecutionContext.current_parameters`
           attribute.

        .. seealso::

            :attr:`.DefaultExecutionContext.current_parameters`

            :ref:`context_default_functions`

        sd   get_current_parameters() can only be invoked in the context of a Python side column default functioni   i    c         3   s)   |  ] } |  d  |   f f Vq d S(   s   %s_m%dN(    (   Rr   R  (   t   indexRp   (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pys	   <genexpr>  s    N(   t   current_parametersR  t   AttributeErrorR   RC  R  R
  Rl   t   _has_multi_parameterst   _is_multiparam_columnR  R  t   originalRp   t   keysR   (   RB   t   isolate_multiinsert_groupsR  RU  R  (    (   R  Rp   s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   get_current_parametersV  s&    			c         C   s0   | j  d  k r d  S|  j | | j  | j  Sd  S(   N(   R   R(   R  RK  (   RB   R  (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   get_insert_default  s    c         C   s0   | j  d  k r d  S|  j | | j  | j  Sd  S(   N(   t   onupdateR(   R  RK  (   RB   R  (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   get_update_default  s    c         C   sw  |  j  j d } i  } |  j  j } |  j  j } x6 | D]. } | j r5 | j j r5 | j j | | <q5 q5 Wx6 | D]. } | j rn | j j rn | j j | | <qn qn Wx |  j D] } | |  _	 xU | D]M } | | k r | | } n |  j
 |  } | d  k	 r | | | |  <q q WxU | D]M } | | k r7| | } n |  j |  } | d  k	 r| | | |  <qqWq W|  `	 d  S(   Ni   (   R
  R  R,  R-  R   t	   is_scalarR  R  R  R  R  R(   R  (   RB   R  t   scalar_defaultsR,  R-  R  R6  t   val(    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR.    s2    	c         C   s   |  j  j d } |  j d |  _ } xs |  j  j D]e } | j rh | j j rh | j j rh | j j } n |  j	 |  } | d  k	 r1 | | | |  <q1 q1 WxB |  j  j D]4 } |  j |  } | d  k	 r | | | |  <q q W|  ` d  S(   Ni   i    (   R
  R  R  R  R,  R   R  R  R  R  R(   R-  R  (   RB   R  R  R  R  (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR/    s    "N(@   R   R   R&   R  R   R!  R&  R#  R  R   R(   R
  Rl   R  R  R+  R)  t   _translate_colnameR   R   RE  R  R  R7  R2  RW  RX  R   R   RZ  R[  R\  R]  Rb  Ri  R  RX   Ra  Rs  R  Ru  Rv  Rw  Rz  R|  R}  R  R  RK   R   R  R  R  R  R  R  R  R  R"   R  R  R  R.  R/  (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyR  d  sl   !t	n0		!		 					
						'				W	:			%(   R   R>   R   RN  RE   R8  R    R   R   R   R   R   R   R   Rz   R   t   sqlR	   R
   R   Rc   t   It   UNICODERk  Rq  t   DialectR   R  t   ExecutionContextR  t   execution_ctx_cls(    (    (    s8   lib/python2.7/site-packages/sqlalchemy/engine/default.pyt   <module>   s8     *   w