B 4]_@sdZddlZddlZddlZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd lm Z dd lm Z d d lm Z d dlmZedddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdlg^ZedmejZednejZdodpeddqDdrgZedsejZedsejZedtejZeduejZedvejZdwdxdydzd{d|Zejd}ej d~ej!dej"dej#dej$dej%dej&dej'dej(dej)dej*dej+dej,dej-dej.dej/dej0dej1dej2dej3dej4dej5dej6dej7dej8dej9dej:dej;dejdej?dej@dejAdejBdejCdi%ZDejEdejFdejGdejHdejIdejJdejKdejLdejMdejNdejOdejPdejQdejRdiZSddddddddddddddddZTe jUjVde jUjWde jUjXde jUjYde jUjZde jUj[diZ\GddƄde]Z^GddȄde_ej`e]ZaGddʄde jbZcGdd̄de^ZdGdd΄dedZeGddЄde^ZfGdd҄deaZgGddԄdegZhGddքde]ZidS)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)utilallZanalyseZanalyzeandanyZarrayasZascZ asymmetricZ authorizationZbetweenbinaryZbothZcasecastZcheckcollatecolumn constraintcreateZcross current_dateZ current_role current_timecurrent_timestamp current_userdefault deferrableZdescZdistinctZdoelseendexceptfalseforZforeignZfreezefromfullZgrantgroupZhavingZilikein initiallyinnerZ intersectZintoisZisnulljoinZleadingleftZlikelimit localtimelocaltimestampZnaturalnewnotZnotnullZnullZoffoffsetoldZonZonlyororderZouterZoverlapsZplacingZprimaryZ referencesrightselect session_usersetZsimilarZsome symmetrictableZthentoZtrailingtrueunionuniqueuserZusingverboseZwhenwherez ^[A-Z0-9_$]+$z^[A-Z0-9_ $]+$cCsh|] }t|qS)str).0xrBrBJ/opt/alt/python37/lib64/python3.7/site-packages/sqlalchemy/sql/compiler.py srG $z5^(?:RESTRICT|CASCADE|SET NULL|NO ACTION|SET DEFAULT)$z^(?:DEFERRED|IMMEDIATE)$z%(? z >= z = z IS DISTINCT FROM z IS NOT DISTINCT FROM z || z MATCH z NOT MATCH z IN z NOT IN z, z FROM z AS z IS z IS NOT z COLLATE zEXISTS z DISTINCT zNOT zANY zALL z DESCz ASCz NULLS FIRSTz NULLS LASTcoalesceZ CURRENT_DATEZ CURRENT_TIMEZCURRENT_TIMESTAMPZ CURRENT_USERZ LOCALTIMEZLOCALTIMESTAMPrandomsysdateZ SESSION_USERZUSERZCUBEZROLLUPz GROUPING SETSmonthdayyearsecondhourdoyminutequarterdowweekepoch milliseconds microseconds timezone_hourtimezone_minute)rRrSrTrUrVrWrXrYrZr[r\r]r^r_r`UNIONz UNION ALLEXCEPTz EXCEPT ALL INTERSECTz INTERSECT ALLc@seZdZdZdZeZddefddZe ddddZ d d Z e d d Z d dZddZdddZe ddZddZddZdS)CompiledaRepresent 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. NcCsb||_||_|jj|_|r(|j||_|dk r^||_|j|_|jrL|j|_ |j |jf||_ dS)aqConstruct a new :class:`.Compiled` object. :param dialect: :class:`.Dialect` to compile against. :param statement: :class:`.ClauseElement` to be compiled. :param bind: Optional Engine or Connection to compile this statement against. :param schema_translate_map: dictionary of schema names to be translated when forming the resultant SQL .. versionadded:: 1.1 .. seealso:: :ref:`schema_translating` :param compile_kwargs: additional kwargs that will be passed to the initial call to :meth:`.Compiled.process`. N) dialectbindZidentifier_preparerpreparer_with_schema_translate statementZsupports_execution can_execute_execution_optionsexecution_optionsprocessstring)selfrerirfschema_translate_mapZcompile_kwargsrBrBrF__init__s  zCompiled.__init__z0.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.cCsdS)zDProduce the internal string representation of this element. NrB)rorBrBrFcompileAs zCompiled.compilecCs$|jr||||St|jdS)N)rj_execute_compiledr ZObjectNotExecutableErrorri)roZ connection multiparamsparamsrBrBrF_execute_on_connectionMszCompiled._execute_on_connectioncCs tdS)zReturn a Compiled that is capable of processing SQL expressions. If this compiler is one, it would likely just return 'self'. N)NotImplementedError)rorBrBrF sql_compilerSszCompiled.sql_compilercKs|j|f|S)N)_compiler_dispatch)roobjkwargsrBrBrFrm]szCompiled.processcCs |jpdS)z3Return the string text of the generated SQL or DDL.)rn)rorBrBrF__str__`szCompiled.__str__cCs tdS)zReturn the bind params for this compiled object. :param params: a dict of string/object pairs whose values will override bind values compiled in to the statement. N)rw)rorurBrBrFconstruct_paramseszCompiled.construct_paramscCs|S)z0Return the bind params for this compiled object.)r~)rorBrBrFruoszCompiled.paramscOs*|j}|dkrtjddd||||S)zExecute this compiled object.Nz>This Compiled object is not bound to any Engine or Connection.Z2afi)code)rfr ZUnboundExecutionErrorrs)rortruerBrBrFexecutets zCompiled.executecOs|j||S)zJExecute this compiled object and return the result's scalar value.)rscalar)rortrurBrBrFrszCompiled.scalar)N)__name__ __module__ __qualname____doc__Z_cached_metadatar immutabledictrlrqZ deprecatedrrrvpropertyrxrmr}r~rurrrBrBrBrFrds"  )    rdc@s$eZdZdZdZddZddZdS) TypeCompilerz2Produces DDL specification for TypeEngine objects.z visit_\w+cCs ||_dS)N)re)rorerBrBrFrqszTypeCompiler.__init__cKs|j|f|S)N)ry)rotype_kwrBrBrFrmszTypeCompiler.processN)rrrrZ ensure_kwargrqrmrBrBrBrFrsrc@sBeZdZdZdZdZdddZeddZed d Z d d Z d S) _CompileLabelz;lightweight label object which acts as an expression.Label.label)elementnamerBcCs||_||_|f||_dS)N)rr _alt_names)rocolr alt_namesrBrBrFrqsz_CompileLabel.__init__cCs|jjS)N)r proxy_set)rorBrBrFrsz_CompileLabel.proxy_setcCs|jjS)N)rtype)rorBrBrFrsz_CompileLabel.typecKs|S)NrB)rorrBrBrF self_groupsz_CompileLabel.self_groupN)rB) rrrr__visit_name__ __slots__rqrrrrrBrBrBrFrs   rc@seZdZdZeZeZdZZ Z dZ dZ dZ dZdZdZdZdZdZdZZdddZedd Zejd d Zejd d ZddZej ddZ!ddZ"eddZ#dddZ$eddZ%e&dddZ'ddZ(ddd Z)dd!d"Z*dd#d$Z+d d%d&Z,d'd(Z-d d)d*Z.d+d,Z/d-d.Z0d/d0Z1d1d2Z2d3d4Z3d5d6Z4d7d8Z5d d9d:Z6d;d<Z7d=d>Z8d?d@Z9dAdBZ:dCdDZ;dEdFZdKdLZ?dMdNZ@dOdPZAdQdRZBd dSdTZCdUdVZDdWdXZEdYdZZFd d\d]ZGd^d_ZHd`daZIdbdcZJdddeZKdfdgZLdhdiZMdjdkZNdldmZOdndoZPddpdqZQdrdsZRdtduZSdvdwZTdxdyZUdzd{ZVdd|d}ZWd~dZXddZYej ddZZddZ[ddZ\ddZ]ddZ^ddZ_ddZ`ddZaddZbddZcddZdddZeddZfdddZgddZhddZiddZjddZkddZlddZmdddZndddZodddZpddZqdddZrddZsddZtdddZuddZvddZwddZxddZyddÄZzddńZ{ddDŽZ|e}de~fde~fgZddd˄Zddd̈́ZddτZddфZddӄZddՄZddׄZddلZddۄZdd݄Zdd߄ZddZddZddZdddZdddZddZdddZddZddZddZdddZej ddZddZddZdddZddZddZddZdS( SQLCompilerzsDefault implementation of :class:`.Compiled`. Compiles :class:`.ClauseElement` objects into SQL strings. FNTrBcKs||_|pt|dd|_i|_t|_g|_g|_|j |_ |j rTg|_ |j dk|_ t |j |_d|_|jpp|j|_t|j|_i|_tj|||f||js|js|jr|jr|j|_|j r|j r|dS)aConstruct a new :class:`.SQLCompiler` object. :param dialect: :class:`.Dialect` to be used :param statement: :class:`.ClauseElement` to be compiled :param column_keys: a list of column names to be compiled into an INSERT or UPDATE statement. :param inline: whether to generate INSERT statements as "inline", e.g. not formatted to return any generated defaults :param kwargs: additional keyword arguments to be consumed by the superclass. inlineFrMN) column_keysgetattrrbindsr Z column_dict bind_namesstack_result_columns positional positiontup paramstyle_numeric_bindsBIND_TEMPLATES bindtemplatectes label_lengthmax_identifier_lengthZ PopulateDict _process_anonanon_maptruncated_namesrdrqisinsertisupdateisdelete _returning returning_apply_numbered_params)rorerirrr{rBrBrFrqs*    zSQLCompiler.__init__cCst|j|jS)N)listinsert_prefetchupdate_prefetch)rorBrBrFprefetch<szSQLCompiler.prefetchcCs&t|_i|_d|_|jr"i|_dS)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_namectes_recursivercte_positional)rorBrBrF_init_cte_state@s  zSQLCompiler._init_cte_statec csp|j|j}}gd|_|_z0|jr8|jd}d|d<nd}|j|jfVWd|r\|d|||_|_XdS)z;special API to support the use case of 'nested result sets'FTneed_result_map_for_nestedN)r_ordered_columnsrpop)roZresult_columnsZordered_columnsentryrBrBrF_nested_resultNs    zSQLCompiler._nested_resultcs(tdtdfdd|j|_dS)Nrz \[_POSITION\]csttS)N)rCr next)m)poscountrBrFiz4SQLCompiler._apply_numbered_params..) itertoolscountresubrn)rorB)rrFrfs z"SQLCompiler._apply_numbered_paramscs"tddfddjDDS)Ncss"|]\}}|dk r||fVqdS)NrB)rDkeyvaluerBrBrF osz/SQLCompiler._bind_processors..c3s&|]}j||jjfVqdS)N)rrZ_cached_bind_processorre)rD bindparam)rorBrFrqs)dictr)rorB)rorF_bind_processorsls zSQLCompiler._bind_processorscCst|jdkS)Nr)lenr)rorBrBrF is_subqueryzszSQLCompiler.is_subquerycCs|S)NrB)rorBrBrFrx}szSQLCompiler.sql_compilercCs2|ri}x|jD]}|j|}|j|kr8||j||<q||krN||||<q|r|jr|rvtjd|j|fddqtjd|jddq|jr|j||<q|j||<qW|Si}xt|jD]j}|r|jr|rtjd|j|fddntjd|jdd|jr|j||j|<q|j||j|<qW|SdS)z5return a dictionary of bind parameter keys and valuesz@A value is required for bind parameter %r, in parameter group %dZcd3x)rz)A value is required for bind parameter %rN)rrZrequiredr ZInvalidRequestErrorcallableeffective_valuer)roruZ _group_number_checkZpdrrrBrBrFr~sL            zSQLCompiler.construct_paramscCs |jddS)zoReturn the bind param dictionary embedded into this compiled object, for those values that are present.F)r)r~)rorBrBrFruszSQLCompiler.paramszsqlalchemy.engine.resultcCs|j|jS)z(utility method used for unit tests only.)ZResultMetaData_create_result_mapr)roresultrBrBrFrszSQLCompiler._create_result_mapcCsdS)zCalled when a SELECT statement has no froms, and no FROM clause is to be appended. Gives Oracle a chance to tack on a ``FROM DUAL`` to the string output. r|rB)rorBrBrF default_fromszSQLCompiler.default_fromcKsd|jj|f|dS)N())rry)roZgroupingasfromr{rBrBrFvisit_groupingszSQLCompiler.visit_groupingc Ks|jrl|jjrl|jdd}|j\}}}|r2|}n|}|jj} | dk rl| j|krl| || jrl|jj|d<|j|jfd|i|S)Nrrrender_label_as_labelwithin_columns_clause) rreZsupports_simple_order_by_label_label_resolve_dictrZ_order_by_label_elementrZshares_lineagerm) rorrr{r with_cols only_froms only_colsZ resolve_dictZ order_by_elemrBrBrFvisit_label_references     z!SQLCompiler.visit_label_referencec Ks|js||jS|jdd}|j\}}}y|r>||j}n ||j}Wn&tk rpt|jtj dYn X||d<|j|fd|i|SdS)Nrrz6Can't resolve label reference for ORDER BY / GROUP BY.rr) rrmZ _text_clauserrKeyErrorrZ_no_text_coercionr CompileError) rorrr{rrrrrrBrBrFvisit_textual_label_references     z)SQLCompiler.visit_textual_label_referencec Ks|o| }||k}|s|r>t|jtjr8|d|j} n|j} |r|dk rf|| |j|| f|j|j|jj|fddd|t t j |j || S|r|j || S|jj|fddi|SdS)NcolidentT)rwithin_label_clauserF) isinstancerr_truncated_label_truncated_identifierrrrry OPERATORSras_rg format_label) roradd_to_result_maprrrrZrender_label_with_asZrender_label_onlyZ labelnamerBrBrF visit_label s$   2zSQLCompiler.visit_labelcCstddS)Nz:Cannot compile Column object until its 'name' is assigned.)r r)rorrBrBrF_fallback_column_name=sz!SQLCompiler._fallback_column_namec Ks|j}}|dkr||}|j}|s>t|tjr>|d|}|dk r^||||||jf|j|rn| |}n |j |}|j }|dks|r|j s|S|j |} | r|j | d} nd} |j} t| tjr|d| } | |j | d|SdS)Nr.r|alias)rr is_literalrrrrrrescape_literal_columnrgquoter:Znamed_with_columnschema_for_object quote_schema) rorr include_tabler{rZ orig_namerr:effective_schemaZ schema_prefixZ tablenamerBrBrF visit_columnBs.        zSQLCompiler.visit_columncKs|j|jS)N)rgformat_collation collation)rorrrBrBrFvisit_collationjszSQLCompiler.visit_collationcKs|jS)N)r)roZ fromclauser{rBrBrFvisit_fromclausemszSQLCompiler.visit_fromclausecKs|jS)N)r)roindexr{rBrBrF visit_indexpszSQLCompiler.visit_indexcKs||d<|jjj|jf|S)Ntype_expression)re type_compilerrmr)ro typeclauserrBrBrFvisit_typeclausesszSQLCompiler.visit_typeclausecCs|jjr|dd}|S)N%z%%)rg_double_percentsreplace)rotextrBrBrFpost_process_textws zSQLCompiler.post_process_textcCs|jjr|dd}|S)Nrz%%)rgrr)rorrBrBrFr|s z!SQLCompiler.escape_literal_columnc s<fdd}jsd_tddt|jS)Ncs:|d}|jkr(jj|fSj|fSdS)Nr)r%Z _bindparamsrmbindparam_string)rr)rro textclauserBrF do_bindparams  z2SQLCompiler.visit_textclause..do_bindparamTcSs |dS)Nr)r%)rrBrBrFrrz.SQLCompiler.visit_textclause..)r isplaintextBIND_PARAMS_ESCr BIND_PARAMSr r)ror rr rB)rror rFvisit_textclauseszSQLCompiler.visit_textclausec Ks|j }|r|jn|jd}|p>|dkr4|ddp>|dd}|rt|j|_|_x |jD]} |j| d|jdqZW|j|j f|} |r|rd| } | S) Nrrneed_result_map_for_compoundFrT)rrz(%s)) r_default_stack_entrygetrr_textual_ordered_columnsZ column_argsrm_add_to_result_mapr) roZtafcompound_indexrparensrtoplevelrpopulate_result_mapcrrBrBrFvisit_text_as_froms"   zSQLCompiler.visit_text_as_fromcKsdS)NZNULLrB)roexprrrBrBrF visit_nullszSQLCompiler.visit_nullcKs|jjr dSdSdS)Nr<1)resupports_native_boolean)rorrrBrBrF visit_trueszSQLCompiler.visit_truecKs|jjr dSdSdS)Nr!0)rer)rorrrBrBrF visit_falseszSQLCompiler.visit_falsec s^|j}|dkrd}n t|j}|ddfdd|jDD}|jrZjjrZd|}|S)N css|]}|r|VqdS)NrB)rDsrBrBrFrsz/SQLCompiler.visit_clauselist..c3s|]}|jfVqdS)N)ry)rDr)rrorBrFrszVALUES )operatorrr*clausesZ _tuple_valuesreZtuple_in_values)roZ clauselistrseprrB)rrorFvisit_clauselists zSQLCompiler.visit_clauselistcKsd}|jdk r&||jj|f|d7}x>|jD]4\}}|d|j|f|d|j|f|d7}q.W|jdk r|d|jj|f|d7}|d7}|S)NzCASE r#zWHEN z THEN zELSE ZEND)rryZwhensZelse_)roclauser{rEZcondrrBrBrF visit_cases . zSQLCompiler.visit_casecKs|jj|f|S)N)Ztyped_expressionry)roZ type_coercerrBrBrFvisit_type_coerceszSQLCompiler.visit_type_coercecKs$d|jj|f||jj|f|fS)NzCAST(%s AS %s))r)ryr)rorr{rBrBrF visit_castszSQLCompiler.visit_castc Ksd|dtjkrdn\|dtjkr&dnJ|ddkrTd|jtt|df|fnd|jt|df|f|dtjkrdn\|dtjkrdnJ|ddkrd|jtt|df|fnd|jt|df|ffS) Nz %s AND %srzUNBOUNDED PRECEDINGz CURRENT ROWz %s PRECEDINGz %s FOLLOWINGrzUNBOUNDED FOLLOWING)rZRANGE_UNBOUNDEDZ RANGE_CURRENTrmliteralabs)rorange_rrBrBrF_format_frame_clauses..z SQLCompiler._format_frame_clausec s|jrdj|jf}n |jr8dj|jf}nd}d|jjfdfddd|jfd|jffD|r||gngfS) NzRANGE BETWEEN %szROWS BETWEEN %sz %s OVER (%s)r#cs6g|].\}}|dk rt|rd||jffqS)Nz%s BY %s)rry)rDZwordr))r{rorBrF sz*SQLCompiler.visit_over..Z PARTITIONZORDER)r/r0Zrowsrryr*Z partition_byorder_by)roZoverr{r/rB)r{rorF visit_overs zSQLCompiler.visit_overcKs$d|jj|f||jj|f|fS)Nz%s WITHIN GROUP (ORDER BY %s))rryr2)roZ withingroupr{rBrBrFvisit_withingroup$szSQLCompiler.visit_withingroupcKs$d|jj|f||jj|f|fS)Nz%s FILTER (WHERE %s))funcryZ criterion)roZ funcfilterr{rBrBrFvisit_funcfilter*szSQLCompiler.visit_funcfiltercKs*|j|j|j}d||jj|f|fS)NzEXTRACT(%s FROM %s)) extract_maprfieldrry)roextractr{r8rBrBrF visit_extract0szSQLCompiler.visit_extractc s|dk r||j|jd|jtd|jd}|rB||f|St|jd}|rd|jr|d7}n*|j}j |rj |n|}|d}d fdd|j D|gdj |f|iSdS)NrBz visit_%s_funcz%(expr)srcs(g|] }j|r j|n|qSrB)rg_requires_quotes_illegal_charsr)rDtok)rorBrFr1Msz.SQLCompiler.visit_function..r)rrrlower FUNCTIONSr __class__Z _has_argsrgr;rr*Z packagenamesfunction_argspec)ror5rr{disprrB)rorFvisit_function7s$   zSQLCompiler.visit_functioncKs ||jS)N)visit_sequencesequence)roZ next_valuerrBrBrFvisit_next_value_funcWsz!SQLCompiler.visit_next_value_funccKstd|jjdS)Nz2Dialect '%s' does not support sequence increments.)rwrer)rorDrrBrBrFrCZszSQLCompiler.visit_sequencecKs|jj|f|S)N)Z clause_exprry)ror5r{rBrBrFr@`szSQLCompiler.function_argspecrc  s(j }|rjnjd}|p2|dko2|dd}j|d|d||dj|j} d| dfd d t|jD} | j |ft fd i7} | j |f7} | |j dk s|j dk rj|fpd 7} jr|r| } jdr |r d | dS| SdS)NrrrFcorrelate_froms asfrom_froms)rFrGrrr#c3s,|]$\}}|jfd|dVqdS)F)rrrN)ry)rDir)rr{rorBrFrzsz4SQLCompiler.visit_compound_select..rr|rr)rrrappendcompound_keywordskeywordr* enumerateselectsgroup_by_clauserorder_by_clause _limit_clause_offset_clause limit_clauser_render_cte_clauser) roZcsrrrr{rrZneed_result_maprKrrB)rr{rorFvisit_compound_selectcs4         z!SQLCompiler.visit_compound_selectcCs(d|j||rd|ndf}t||dS)Nz visit_%s_%s%s_r|)rr)ro operator_Z qualifier1Z qualifier2ZattrnamerBrBrF_get_operator_dispatchs z"SQLCompiler._get_operator_dispatchcKs|jrR|jrtd||jdd}|r:|||jf|S|j|t|jf|SnL|jr||jdd}|r||||jf|S|j|t|jf|Sn tddS)NzFUnary expression does not support operator and modifier simultaneouslyunaryr%modifierz,Unary expression has no operator or modifier)r%rYr rrW _generate_generic_unary_operatorr _generate_generic_unary_modifier)rorXrrArBrBrF visit_unarys&  zSQLCompiler.visit_unarycKs6|js|jjr|j|jf|Sd|j|jf|SdS)Nz%s = 1)_is_implicitly_booleanrerrmr)rorr%rrBrBrFvisit_istrue_unary_operatorsz'SQLCompiler.visit_istrue_unary_operatorcKs:|js|jjr"d|j|jf|Sd|j|jf|SdS)NzNOT %sz%s = 0)r]rerrmr)rorr%rrBrBrFvisit_isfalse_unary_operatorsz(SQLCompiler.visit_isfalse_unary_operatorcKsd|j|tjdS)NzNOT %s)override_operator) visit_binaryrmatch_op)rorr%rrBrBrFvisit_notmatch_op_binarysz$SQLCompiler.visit_notmatch_op_binarycCstddS)NzThe IN-predicate was invoked with an empty sequence. This results in a contradiction, which nonetheless can be expensive to evaluate. Consider alternative strategies for improved performance.)r warn)rorBrBrF_emit_empty_in_warningsz"SQLCompiler._emit_empty_in_warningcKs2|jjr dS|jjr|||j|jkSdS)Nz1 != 1)re_use_static_in_warn_on_empty_inrermr+)rorr%rrBrBrFvisit_empty_in_op_binarys z$SQLCompiler.visit_empty_in_op_binarycKs2|jjr dS|jjr|||j|jkSdS)Nz1 = 1)rerfrgrermr+)rorr%rrBrBrFvisit_empty_notin_op_binarys z'SQLCompiler.visit_empty_notin_op_binarycCstd|jjdS)Nz3Dialect '%s' does not support empty set expression.)rwrer)roZ element_typesrBrBrFvisit_empty_set_exprsz SQLCompiler.visit_empty_set_exprcKs|jr*t|jtjr*t|jtjr*d|d<|p2|j}||dd}|rT|||f|Sy t|}Wn t k rt ||YnX|j ||f|SdS)NT literal_bindsr) ansi_bind_rulesrr+rZ BindParameterr5r%rWrrr ZUnsupportedCompilationError_generate_generic_binary)rorr`eager_groupingrrVrAopstringrBrBrFras  zSQLCompiler.visit_binarycKs|j|jf|S)N)rmZ sql_function)rorr%rrBrBrF&visit_function_as_comparison_op_binary sz2SQLCompiler.visit_function_as_comparison_op_binarycKsT|jjr,|j|jf|d|j|jf|S|j|jf|d|j|jf|SdS)Nz %% z % )rgrrmr+r5)rorr%rrBrBrFvisit_mod_binarys$zSQLCompiler.visit_mod_binarycKs$|j|d<|j|d|jdf|S)Nrnr#)rnrmro)rorr%rrBrBrFvisit_custom_op_binarys z"SQLCompiler.visit_custom_op_binarycKs|j||jdf|S)Nr#)rZro)rorr%rrBrBrFvisit_custom_op_unary_operator"sz*SQLCompiler.visit_custom_op_unary_operatorcKs|j|d|jf|S)Nr#)r[ro)rorr%rrBrBrFvisit_custom_op_unary_modifier'sz*SQLCompiler.visit_custom_op_unary_modifiercKs\|dd}d|d<|jj|fd|i|||jj|fd|i|}|rX|rXd|}|S)N _in_binaryFTrnz(%s))rr+ryr5)rorrornrrurrBrBrFrm,s  z$SQLCompiler._generate_generic_binarycKs||jj|f|S)N)rry)rorXrorrBrBrFrZAsz,SQLCompiler._generate_generic_unary_operatorcKs|jj|f||S)N)rry)rorXrorrBrBrFr[Dsz,SQLCompiler._generate_generic_unary_modifiercCstjdtjdS)Nz'%')r)rZliteral_columnr STRINGTYPE)rorBrBrF_like_percent_literalGsz!SQLCompiler._like_percent_literalcKs2|}|j}||j||_|j||f|S)N)_clonerw__add__r5visit_like_op_binary)rorr%rpercentrBrBrFvisit_contains_op_binaryKsz$SQLCompiler.visit_contains_op_binarycKs2|}|j}||j||_|j||f|S)N)rxrwryr5visit_notlike_op_binary)rorr%rr{rBrBrFvisit_notcontains_op_binaryQsz'SQLCompiler.visit_notcontains_op_binarycKs,|}|j}||j|_|j||f|S)N)rxrw__radd__r5rz)rorr%rr{rBrBrFvisit_startswith_op_binaryWsz&SQLCompiler.visit_startswith_op_binarycKs,|}|j}||j|_|j||f|S)N)rxrwrr5r})rorr%rr{rBrBrFvisit_notstartswith_op_binary]sz)SQLCompiler.visit_notstartswith_op_binarycKs,|}|j}||j|_|j||f|S)N)rxrwryr5rz)rorr%rr{rBrBrFvisit_endswith_op_binarycsz$SQLCompiler.visit_endswith_op_binarycKs,|}|j}||j|_|j||f|S)N)rxrwryr5r})rorr%rr{rBrBrFvisit_notendswith_op_binaryisz'SQLCompiler.visit_notendswith_op_binarycKsL|jdd}d|jj|f||jj|f|f|rFd||tjndS)Nescapez %s LIKE %sz ESCAPE r|) modifiersrr+ryr5render_literal_valuer rv)rorr%rrrBrBrFrzos z SQLCompiler.visit_like_op_binarycKsL|jdd}d|jj|f||jj|f|f|rFd||tjndS)Nrz%s NOT LIKE %sz ESCAPE r|)rrr+ryr5rr rv)rorr%rrrBrBrFr}|s z#SQLCompiler.visit_notlike_op_binarycKsL|jdd}d|jj|f||jj|f|f|rFd||tjndS)Nrzlower(%s) LIKE lower(%s)z ESCAPE r|)rrr+ryr5rr rv)rorr%rrrBrBrFvisit_ilike_op_binarys z!SQLCompiler.visit_ilike_op_binarycKsL|jdd}d|jj|f||jj|f|f|rFd||tjndS)Nrzlower(%s) NOT LIKE lower(%s)z ESCAPE r|)rrr+ryr5rr rv)rorr%rrrBrBrFvisit_notilike_op_binarys z$SQLCompiler.visit_notilike_op_binarycKs&|jdd}|j||rdndf|S)Nr9Fz BETWEEN SYMMETRIC z BETWEEN )rrrm)rorr%rr9rBrBrFvisit_between_op_binarysz#SQLCompiler.visit_between_op_binarycKs&|jdd}|j||rdndf|S)Nr9Fz NOT BETWEEN SYMMETRIC z NOT BETWEEN )rrrm)rorr%rr9rBrBrFvisit_notbetween_op_binarys  z&SQLCompiler.visit_notbetween_op_binaryc Ks&|s<|j|j}|jr<||}|j|fd||d|S|sJ|r|jr|jdkrn|jdkrnt d|j |j |fddi|S| |}||jkr|j|} | |k r| js|jr| j|jst d|j n"| js|jrt d|j |j f||j|j <|j|<|j|fd|ji|S)NT)skip_bind_expressionrrkz@Bind parameter '%s' without a renderable value not allowed here.rzIBind parameter '%s' conflicts with unique bind parameter of the same namezbindparam() name '%s' is reserved for automatic usage in the VALUES or SET clause of this insert/update statement. Please use a name other than column name when using bindparam() with insert() or update() (for example, 'b_%s'). expanding)r dialect_implreZ_has_bind_expressionbind_expressionrmrlrrr rrrender_literal_bindparam_truncate_bindparamrr>r intersectionZ_is_crudr r) rorrrkrr{implrrZexistingrBrBrFvisit_bindparamsB         zSQLCompiler.visit_bindparamcKs|j}|||jS)N)rrr)rorrrrBrBrFrsz$SQLCompiler.render_literal_bindparamcCs(||j}|r||Std|dS)aRender the value of a bind parameter as a quoted literal. This is used for statement sections that do not accept bind parameters on the target driver/database. This should be implemented by subclasses using the quoting services of the DBAPI. z(Don't know how to literal-quote value %rN)Z_cached_literal_processorrerw)rorrZ processorrBrBrFrs z SQLCompiler.render_literal_valuecCs@||jkr|j|S|j}t|tjr2|d|}||j|<|S)Nr)rrrrrr)rorZ bind_namerBrBrFrs     zSQLCompiler._truncate_bindparamcCs||f|jkr|j||fS||j}t||jdkr|j|d}|dt|jdddt|dd}|d|j|<n|}||j||f<|S)NrrrUr )rZ apply_maprrrrmaxhex)roZ ident_classrZanonnameZcounterZ truncnamerBrBrFr s ,z!SQLCompiler._truncated_identifiercCs ||jS)N)r)rorrBrBrF _anonymizeszSQLCompiler._anonymizecCs<|dd\}}|j|d}|d|j|<|dt|S)Nr#rrU)splitrrrC)roridentZderivedZanonymous_counterrBrBrFr"szSQLCompiler._process_anoncKsJ|jr&|dk r||n |j||r8d|_d|S|jd|iSdS)NTz([EXPANDING_%s])r)rrIrcontains_expanding_parametersr)rorpositional_namesrrrBrBrFr (s  zSQLCompiler.bindparam_stringc s||d<t|jtjr.d|j}n|j}d}d} |jkrj|} || k} || jksj|| krpd}n"| |jkrj| =nt d||s|r|j dk r|j } |j j} t| tjrԈd| } n|} d} |r:|j|<d|j j krdjkrjd|j j di_| jkr2j| f|| s:|jkr:|jrRd_j||} |jrt|jtjr|j}nt|jtjr|jjd}ndd t|jD}| d d fd d |D7} jrg|d<j|<| d|jj fddi|7} |j!r0| dj"||j!f|7} | j|<|r|sZ| rZj||S| rj|| } j#|rj$|}| %|7} | Sj||SdS)N visiting_cterTFz5Multiple, unrelated CTEs found with the same name: %rZ autocommitrcSsg|]}|dk r|qS)NrB)rDrrBrBrFr1sz)SQLCompiler.visit_cte..z(%s)z, c3s|]}j|VqdS)N)rg format_column)rDr)rorBrFrsz(SQLCompiler.visit_cte..rz AS rr#)&rrrrrrrZ _restatesrr rZ _cte_aliasrrkrlr= visit_cte recursiverrg format_aliasoriginalrSelectCompoundSelectrMr Z unique_list inner_columnsr*rrry _suffixes_generate_prefixes_requires_quotesrget_render_as_alias_suffix)rocterashint fromhintsrr{Zcte_nameZ is_new_cteZembedded_in_current_named_cteZ existing_cteZ pre_alias_cteZcte_pre_alias_namerZ col_sourceZ recur_colsrB)rorFr6s                 zSQLCompiler.visit_ctec Ks|s|r,t|jtjr&|d|j}n|j}|r>|j||S|r|jj|fddi|| |j||}|r||kr| |||||}|S|jj|f|SdS)NrrT) rrrrrrgrrryrformat_from_hint_text) rorrriscrudrr{Z alias_nameretrBrBrF visit_aliass  zSQLCompiler.visit_aliascKsd|d<d|j|f|S)NTlateralz LATERAL %s)r)rorrrBrBrF visit_lateralszSQLCompiler.visit_lateralcKsRd|j|fddi||j|f|f}|jdk rN|d|jj|f|7}|S)Nz%s TABLESAMPLE %srTz REPEATABLE (%s))rZ _get_methodryZseed)roZ tablesamplerrrrBrBrFvisit_tablesamples zSQLCompiler.visit_tablesamplecCsd|S)Nz AS rB)roZalias_name_textrBrBrFrsz&SQLCompiler.get_render_as_alias_suffixcCs|j||||fdS)N)rrI)rokeynamerobjectsrrBrBrFrszSQLCompiler._add_to_result_mapc s~jj}|jr2|r2|} fdd} n} |rBj} nd} |sR| } nttjr| k r|t | j j fd} n| } n|dk r|rt | |j fd} n|rttj rjsjdk rtjtjst | tj jfd} nvttjs8ttjrjr8tdr*ttjr8t | j} n*| k r^t | tj jfd} n| } |j|| d| jf|S)z.produce labeled columns present in a select().cs||f||dS)N)r)rrrr)rrorBrFrsz;SQLCompiler._label_select_column..add_to_result_mapN)rr)rr)rrreZ_has_column_expressionZcolumn_expressionrrrZLabelrrr _key_labelZ ColumnClauserr:rrZ _as_truncatedrZ TextClauseZUnaryExpressionZwraps_column_expressionhasattrrZFunctionZ anon_labelupdatery) ror6rrrcolumn_clause_argsrrrZcol_exprrZ result_exprrB)rrorF_label_select_columnsV           z SQLCompiler._label_select_columncCs |||}|r|d|7}|S)Nr#)get_from_hint_text)rosqltextr:ZhintrhinttextrBrBrFr;s  z!SQLCompiler.format_from_hint_textcCsdS)NrB)roZbyfromsrBrBrFget_select_hint_textAsz SQLCompiler.get_select_hint_textcCsdS)NrB)ror:rrBrBrFrDszSQLCompiler.get_from_hint_textcCsdS)NrB)ror:rrBrBrFget_crud_hint_textGszSQLCompiler.get_crud_hint_textcCs d|S)Nr#)r*)roZ hint_textsrBrBrFget_statement_hint_textJsz#SQLCompiler.get_statement_hint_textcs"iigfdd|S)zRewrite any "a JOIN (b JOIN c)" expression as "a JOIN (select * from b JOIN c) AS anon", to support databases that can't parse a parenthesized join correctly (i.e. sqlite < 3.7.16). c s|dkrd|S|kr(|S|}|<|jr^|jr^t|jtjr^||jf||_|jf|}tj |j gdd }x|j D]}|j |_|j|_qWtt|jj j |j }|||j j<|||j j<|||jj j<|||jj j<x8tdD]$\}}||kr||d|<qWd|||_|jf||_n|jrd|d<|jfdi|nn|jr|jr|dddk} | rid|d<|jfdi|| rd=n|jfdi||S)NrT) use_labelsZselect_containerZtransform_clueZcloneZ inside_select)rxZ is_selectableZ_is_joinrr5rZ FromGroupingZ_reset_exportedr+rrrrrrrZ_labelrzipritemsronclauseZ_is_from_containerZ_copy_internalsZ _is_selectrrI) rrZnewelemr5Z selectable_rZtranslate_dictkvZbarrier_select)clonedcolumn_translatevisitrBrFrWsR        z=SQLCompiler._transform_select_for_nested_joins..visitrB)ror6rB)rrrrF"_transform_select_for_nested_joinsMsQz.SQLCompiler._transform_select_for_nested_joinscsFtdd|jDtfdd|jDfdd|jD|_dS)Ncss|]}|j|fVqdS)N)r)rDrrBrBrFrszESQLCompiler._transform_result_map_for_nested_joins..c3s|]}|j|fVqdS)N)r)rDr) inner_colrBrFrscs2g|]*\}}}}||tfdd|D|fqS)csg|]}||qSrB)r)rDr)drBrFr1szQSQLCompiler._transform_result_map_for_nested_joins...)tuple)rDrrZobjstyp)rrBrFr1szFSQLCompiler._transform_result_map_for_nested_joins..)rrr)ror6transformed_selectrB)rrrF&_transform_result_map_for_nested_joinss  z2SQLCompiler._transform_result_map_for_nested_joinsrFrGc Cs\|j }|r|jn|jd}|d}|d}|rJ|sJ|j||dd}n|j||d}|S)NrrFrGrB)explicit_correlate_fromsimplicit_correlate_froms)rr_get_display_froms difference) ror6rrrrrFrGfromsrBrBrF_display_froms_for_selects z%SQLCompiler._display_froms_for_selectc  sfjo| oj ojj } | rJ} j| f|||dd| } j } | r\jnjd}| p|dkr~|ddp|ddsd| kr| d=| rr| | S ||}|  ddd d } j r  \}}|r| |d 7} nd}jr,| jjf| 7} | jf| 7} d d fdd jDD}r|dk rttdd jDdd |jDfdd jD_| |||| } jrfdd jD}|r| d |7} jr| r| } jr4| d jjf| 7} jdsL|r^|r^d| dS| SdS)NT)rrrrnested_join_translationrrrFrr)rrzSELECT r#cSsg|]}|dk r|qS)NrB)rDrrBrBrFr1&s z,SQLCompiler.visit_select..c s&g|]\}}j||dqS))r)r)rDrr)rrrr6rorBrFr1(scSsg|] \}}|qSrBrB)rDrrrBrBrFr1;scSsg|] \}}|qSrBrB)rDrrrBrBrFr1=scs2g|]*\}}}}||tfdd|D|fqS)c3s|]}||VqdS)N)r)rDo) translaterBrFrDsz6SQLCompiler.visit_select...)r)rDrrrzr)rrBrFr1Dscs$g|]\}}|djjfkr|qS)*)rer)rD dialect_nameZht)rorBrFr1Nsrr)rrreZsupports_right_nested_joinsr visit_selectrrr_setup_select_stackcopyr_hints_setup_select_hints _prefixesrget_select_precolumnsZ_columns_plus_namesrrr_compose_select_bodyZ_statement_hintsrrrSrr)ror6rrrrrZselect_wraps_forrr{Zneeds_nested_translationrrrrr hint_textbyfromrZ per_dialectrB)rrrr6rorrFrs            zSQLCompiler.visit_selectcs.tfdd|jD}|}||fS)Nc s>g|]6\\}}}|djjfkr||d|jddifqS)rrT)r)rerry)rDfrom_rer)rorBrFr1gs z3SQLCompiler._setup_select_hints..)rrrr)ror6rrrB)rorFrds   zSQLCompiler._setup_select_hintsc Csp|d}|d}|r.|s.|j||dd}n|j||d}ttj|}||} || |d} |j| |S)NrFrGrB)rr)rGrFr)rrr8r _from_objectsr=rrI) ror6rrrrFrGrZnew_correlate_fromsZall_correlate_fromsZ new_entryrBrBrFrss"   zSQLCompiler._setup_select_stackcsB|d|7}|rb|d7}|jrB|dfdd|D7}qn|dfdd|D7}n |7}|jdk r|jjf}|r|d|7}|jjr|j|f7}|jdk r|jjf}|r|d|7}|j jr|j |f7}|j dk s|j dk r |j |f7}|jdk r>|j|f7}|S)Nz, z FROM cs$g|]}|jfddqS)T)rr)ry)rDf)rr{rorBrFr1sz4SQLCompiler._compose_select_body..cs"g|]}|jfddiqS)rT)ry)rDr)r{rorBrFr1sz WHERE z HAVING )r*rr _whereclausery_group_by_clauser&rNZ_having_order_by_clauserOrPrQrRZ_for_update_argfor_update_clause)rorr6rrrr{trB)rr{rorFrs:         z SQLCompiler._compose_select_bodyc s*dfdd|D}|r&|d7}|S)Nr#c3s4|],\}}|dks|jjkr|jfVqdS)N)rerry)rDprefixr)rrorBrFrsz1SQLCompiler._generate_prefixes..)r*)rostmtprefixesrr)rB)rrorFrs   zSQLCompiler._generate_prefixescsbjr(tfddjDgj_jd}|dddjD7}|d7}|S)Ncsg|]}j|qSrB)r)rDr)rorBrFr1sz2SQLCompiler._render_cte_clause..r#z, cSsg|]}|qSrBrB)rDZtxtrBrBrFr1sz )rsumrrget_cte_preamblerr*values)roZcte_textrB)rorFrSs zSQLCompiler._render_cte_clausecCs|rdSdSdS)NzWITH RECURSIVEZWITHrB)rorrBrBrFrszSQLCompiler.get_cte_preamblecKs|jr dp dS)zcCalled when building a ``SELECT`` statement, position is just before column list. z DISTINCT r|)Z _distinct)ror6rrBrBrFrsz!SQLCompiler.get_select_precolumnscKs$|jj|f|}|rd|SdSdS)z5allow dialects to customize how GROUP BY is rendered.z GROUP BY r|N)rry)ror6rZgroup_byrBrBrFrNszSQLCompiler.group_by_clausecKs$|jj|f|}|rd|SdSdS)z5allow dialects to customize how ORDER BY is rendered.z ORDER BY r|N)rry)ror6rr2rBrBrFrOszSQLCompiler.order_by_clausecKsdS)Nz FOR UPDATErB)ror6rrBrBrFrszSQLCompiler.for_update_clausecCstddS)Nz@RETURNING is not supported by this dialect's statement compiler.)r r)rorreturning_colsrBrBrFreturning_clauseszSQLCompiler.returning_clausecKs^d}|jdk r&|d|j|jf|7}|jdk rZ|jdkrB|d7}|d|j|jf|7}|S)Nr|z LIMIT z LIMIT -1z OFFSET )rPrmrQ)ror6rrrBrBrFrR s   zSQLCompiler.limit_clausec Ksv|s|rn|j|}|r<|r<|j|d|j|j} n|j|j} |rj||krj|| ||||} | SdSdS)Nrr|)rgrrrrr) ror:rrrr use_schemar{rrrBrBrF visit_table s    zSQLCompiler.visit_tablecKsd|jr d}n|jrd}nd}|jj|fddi|||jj|fddi|d|jj|f|S)Nz FULL OUTER JOIN z LEFT OUTER JOIN z JOIN rTz ON )r$Zisouterr+ryr5r)ror*rr{Z join_typerBrBrF visit_join* s zSQLCompiler.visit_joincsFtfdd|jD}|j|kr>||j||jd}||fS)Ncs,g|]$\\}}}|djjfkr||fqS)r)rer)rDr:rer)rorBrFr1< s z1SQLCompiler._setup_crud_hints..T)rrrr:r)ror table_text dialect_hintsrB)rorF_setup_crud_hints9 s  zSQLCompiler._setup_crud_hintsc s|j }|jtt|dtj||tjf|}|sZ|jjsZ|jjsZt d|jj |j r|jj szt d|jj |d}n|}|j|jj}d}|jr||j||jf|7}|d7}|j} |jr||| \} } || 7}|s|s|ddfd d |D7}|js"|jrN|||jp4|j} |jrR|d | 7}nd} |jdk r|j|jf|} |jr|r|jjr|d || f7}n |d | 7}nX|s|r|d7}nB|j r|dddd|D7}n|dddd |D7}|j dk r0|j|j f|} | r0|d | 7}| rJ|jsJ|d | 7}|jrn|rn|jjsn||}|j!d|rd|dS|SdS)N)rFrGrzWThe '%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.rzINSERT zINTO z (%s)z, csg|]}|dqS)r)r)rDr)rgrBrFr1 sz,SQLCompiler.visit_insert..r#z %s%sz %sz DEFAULT VALUESz VALUES %scss&|]}dddd|DVqdS)z(%s)z, css|]}|dVqdS)rNrB)rDrrBrBrFr sz5SQLCompiler.visit_insert...N)r*)rDZcrud_param_setrBrBrFr sz+SQLCompiler.visit_insert..z VALUES (%s)cSsg|] }|dqS)rrB)rDrrBrBrFr1 srrr)"rrIr8r_setup_crud_paramsZISINSERTresupports_default_valuesZsupports_empty_insertr rrZ_has_multi_parametersZsupports_multivalues_insertrgrr format_tabler:rrr*rrrreturning_precedes_valuesr6rmZ_insert_from_selectrZcte_follows_insertrSZ_post_values_clauser)roZ insert_stmtrrr crud_paramsZcrud_params_singlerrrrUrZ select_textZpost_values_clauserB)rgrF visit_insertG s                zSQLCompiler.visit_insertcCsdS)z3Provide a hook for MySQL to add LIMIT to the UPDATENrB)ro update_stmtrBrBrFupdate_limit_clause szSQLCompiler.update_limit_clausecKsd|d<|j|fddi|S)z|Provide a hook to override the initial table clause in an UPDATE statement. MySQL overrides this. Trr)ry)ror from_table extra_fromsrrBrBrFupdate_tables_clause sz SQLCompiler.update_tables_clausecKs tddS)z~Provide a hook to override the generation of an UPDATE..FROM clause. MySQL and MSSQL override this. zCThis backend does not support multiple-table criteria within UPDATEN)rw)rorrr from_hintsrrBrBrFupdate_from_clause s zSQLCompiler.update_from_clausec s(j }|j}t|}|rHtt|jfdd|D}|}n g}|jh}j|||dd} |j r| j ||j f|7} j ||j|f|} t j |t jf|} |jrȈ|| \} } nd} | | 7} | d7} |oj| dfdd| D7} js|jr:jr:| d |jp2|j7} |rhj||j|| f|} | rh| d | 7} |jdk rj|jf|}|r| d |7} |}|r| d |7} js|jrjs| d |jp|j7} jr|r| } jd |r d | d S| SdS)Ncsg|]}|kr|qSrBrB)rDr) main_fromsrBrFr1 sz,SQLCompiler.visit_update..)rFrGrzUPDATE z SET z, c3s,|]$}|djdd|dVqdS)r)r=rN)ry)rDr)rrorBrFr sz+SQLCompiler.visit_update..r#z WHERE rrr)r _extra_fromsboolr8rrr:r=rIrrrrrZISUPDATErr'render_table_with_column_in_update_fromr*rrrrrrrmrrrSr)rorrrrrZ is_multitableZrender_extra_fromsrFrrrrextra_from_textrrRrB)rrrorF visit_update sz             zSQLCompiler.visit_updatecCst||jS)N)r_key_getters_for_crud_columnri)rorBrBrFr6 sz(SQLCompiler._key_getters_for_crud_columncKs tddS)zProvide a hook to override the generation of an DELETE..FROM clause. This can be used to implement DELETE..USING for example. MySQL and MSSQL override this. zCThis backend does not support multiple-table criteria within DELETEN)rw)rorrrrrrBrBrFdelete_extra_from_clause: s z$SQLCompiler.delete_extra_from_clausecCs|j|dddS)NT)rr)ry)ro delete_stmtrrrBrBrFdelete_table_clauseJ szSQLCompiler.delete_table_clausec Ks|j }tj||tjf||j}|jh|}|j|||dd}|jrd||j ||jf|7}|d7}| ||j|}|j r| ||\} }nd} ||7}|j r|jr|d|||j 7}|r|j||j|| f|} | r|d| 7}|jdk r|jj|f|} | r|d| 7}|j r@|js@|d|||j 7}|jrZ|rZ||}|jd|rxd|dS|SdS) N)rFrGrzDELETE zFROM r#z WHERE rrr)rrrZISDELETEr r:r=rIrrrrrrrrrrryrrSr) rorrrrrrFrrrr rrBrBrF visit_deleteM s\        zSQLCompiler.visit_deletecCsd|j|S)Nz SAVEPOINT %s)rgformat_savepoint)rosavepoint_stmtrBrBrFvisit_savepoint szSQLCompiler.visit_savepointcCsd|j|S)NzROLLBACK TO SAVEPOINT %s)rgr)rorrBrBrFvisit_rollback_to_savepoint sz'SQLCompiler.visit_rollback_to_savepointcCsd|j|S)NzRELEASE SAVEPOINT %s)rgr)rorrBrBrFvisit_release_savepoint sz#SQLCompiler.visit_release_savepoint)NF)NNT)F)F)F)NFFN)NT)NFT)N)FTr)NF)F)FFF)NF)FFNN)FFFN)F)NT)F)FTNrFNF)FFFNT)F)F)F)F)rrrr EXTRACT_MAPr7COMPOUND_KEYWORDSrJrrrr rrr rrlrrrrrrqrrr Zmemoized_instancemethodr contextlibcontextmanagerrrmemoized_propertyrrrxr~ru dependenciesrrrrrrrrrrrrr rrrrr r"r(r*r+r,r0r3r4r6r:rBrErCr@rTrWr\r^r_rcrerhrirjrarprqrrrsrtrmrZr[rwr|r~rrrrrzr}rrrrrrrrrrrr rrrrrrrrrrrrrrr frozensetrrrrrrrrSrrrNrOrrrRrrrrrrrrrrrrrrrrBrBrBrFrsH  G   8   "  + '   2           8   v    L]  6        m  f J rc@sPeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ dS)StrSQLCompilerawA :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:`.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:`.ClauseElement.compile` directly. .. seealso:: :ref:`faq_sql_expression_string` cCsdS)NzrB)rorrBrBrFr sz$StrSQLCompiler._fallback_column_namecKs$d|j|jf||j|jf|fS)Nz%s[%s])rmr+r5)rorr%rrBrBrFvisit_getitem_binary sz#StrSQLCompiler.visit_getitem_binarycKs|j||f|S)N)r!)rorr%rrBrBrFvisit_json_getitem_op_binary sz+StrSQLCompiler.visit_json_getitem_op_binarycKs|j||f|S)N)r!)rorr%rrBrBrF!visit_json_path_getitem_op_binary sz0StrSQLCompiler.visit_json_path_getitem_op_binarycKsd|j|S)Nz)rgformat_sequence)roseqrrBrBrFrC szStrSQLCompiler.visit_sequencecs&fddt|D}dd|S)Nc sg|]}d|ddiqS)NTF)r)rDr)rorBrFr1 sz3StrSQLCompiler.returning_clause..z RETURNING z, )rZ_select_iterablesr*)rorrcolumnsrB)rorFr s zStrSQLCompiler.returning_clausec s ddfdd|DS)NzFROM z, c3s&|]}|jfddVqdS)T)rrN)ry)rDr)rrrorBrFr sz4StrSQLCompiler.update_from_clause..)r*)rorrrrrrB)rrrorFr sz!StrSQLCompiler.update_from_clausec s ddfdd|DS)Nz, c3s&|]}|jfddVqdS)T)rrN)ry)rDr)rrrorBrFr sz:StrSQLCompiler.delete_extra_from_clause..)r*)rorrrrrrB)rrrorFr sz'StrSQLCompiler.delete_extra_from_clauseN) rrrrrr!r"r#rCrrrrBrBrBrFr  sr c@sBeZdZejddZejddZdLddZdd Zd d Z d d Z ddZ dMddZ dNddZ ddZddZddZdOddZddZdPd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Zd:d;Z dd?Z"d@dAZ#dBdCZ$dDdEZ%dFdGZ&dHdIZ'dJdKZ(dS)Q DDLCompilercCs|j|jdS)N)reZstatement_compiler)rorBrBrFrx szDDLCompiler.sql_compilercCs|jjS)N)rer)rorBrBrFr szDDLCompiler.type_compilerNcCsdS)NrB)rorurBrBrFr~ szDDLCompiler.construct_paramscKs|j}t|jtjr|}|j}||j}t|dkrJ|dd}}n|d|d}}| d|| d|| d| |j|j |j |S)Nrrr|rr:rfullname)contextrtargetrZTablerrgformat_table_seqr setdefaultrrxr ri)roZddlr{r)rgpathr:ZschrBrBrF visit_ddl s    zDDLCompiler.visit_ddlcCs|j|j}d|S)NzCREATE SCHEMA )rg format_schemar)rorrrBrBrFvisit_create_schema szDDLCompiler.visit_create_schemacCs(|j|j}d|}|jr$|d7}|S)Nz DROP SCHEMA z CASCADE)rgr/rcascade)rodroprrrBrBrFvisit_drop_schema s zDDLCompiler.visit_drop_schemac CsR|j}|j}d}|jr*|d|jd7}|d||d7}||}|rZ||d7}|d7}d}d}x|jD]}|j} yD|j|| jo| d} | dk r||7}d}|d | 7}| jrd }Wqrt j k r} z.t t t d |j| j| jd fWdd} ~ XYqrXqrW|j||jd } | r<||d | 7}|d||7}|S)Nz CREATE r#zTABLE r F)first_pkz,  Tz (in table '%s', column '%s'): %sr) _include_foreign_key_constraintsz )%s )rrgrr*rcreate_table_suffixr&rm primary_keyr rr Zraise_from_causeu descriptionrargscreate_table_constraintsZinclude_foreign_key_constraintspost_create_table) rorr:rgrr8Z separatorr5Z create_columnrZ processedZceconstrBrBrFvisit_create_table sF    0 zDDLCompiler.visit_create_tableFcsL|j}|jrdSj||d}dfdd|jD}|rH|d|7}|S)N)r5r#c3s|]}|VqdS)N)rm)rDr)rorBrFrE sz2DDLCompiler.visit_create_column..)rsystemget_column_specificationr* constraints)rorr5rrr?rB)rorFvisit_create_column= s zDDLCompiler.visit_create_columncstg}jr|jj}|dk r0||nt|fddjDdddfdd|DDS)Ncs"g|]}|jk r|kr|qSrB)r9)rDr) omit_fkcsr:rBrFr1^ sz8DDLCompiler.create_table_constraints..z, css|]}|dk r|VqdS)NrB)rDprBrBrFre s z7DDLCompiler.create_table_constraints..c3s@|]8}|jdks|rjjr.t|dds|VqdS)NZ use_alterF)Z _create_rulereZsupports_alterrrm)rDr)rorBrFrg s   )r9rIZforeign_key_constraintsrr8extendZ_sorted_constraintsr*)ror:r7rCZall_fkcsrB)rEror:rFr=L s     z$DDLCompiler.create_table_constraintscCsd|j|jS)Nz DROP TABLE )rgrr)ror2rBrBrFvisit_drop_tableu szDDLCompiler.visit_drop_tablecCsd|j|jS)Nz DROP VIEW )rgrr)ror2rBrBrFvisit_drop_viewx szDDLCompiler.visit_drop_viewcCs|jdkrtd|jdS)Nz,Index '%s' is not associated with any table.)r:r rr)rorrBrBrF_verify_index_table{ s zDDLCompiler._verify_index_tableTc sj|j}|j}d}|jr(|d7}|dj||d|j|j|ddfdd|jDf7}|S) NzCREATE zUNIQUE zINDEX %s ON %s (%s))include_schema)rz, c3s |]}jj|dddVqdS)FT)rrkN)rxrm)rDr)rorBrFr sz1DDLCompiler.visit_create_index..) rrJrgr>_prepared_index_namerr:r*Z expressions)rorrKZinclude_table_schemarrgrrB)rorFvisit_create_index s    zDDLCompiler.visit_create_indexcCs|j}d|j|ddS)Nz DROP INDEX T)rK)rrL)ror2rrBrBrFvisit_drop_index szDDLCompiler.visit_drop_indexcCsX|jdk r|j|j}nd}|r4|r4|j|}nd}|j|}|rT|d|}|S)Nr)r:rgrr format_index)rorrKrZ schema_nameZ index_namerBrBrFrL s   z DDLCompiler._prepared_index_namecCs d|j|jj||jfS)NzALTER TABLE %s ADD %s)rgrrr:rm)rorrBrBrFvisit_add_constraint sz DDLCompiler.visit_add_constraintcCs(d|j|j|j|jjtfS)NzCOMMENT ON TABLE %s IS %s)rgrrrxrcommentr String)rorrBrBrFvisit_set_table_comment s z#DDLCompiler.visit_set_table_commentcCsd|j|jS)NzCOMMENT ON TABLE %s IS NULL)rgrr)ror2rBrBrFvisit_drop_table_comment sz$DDLCompiler.visit_drop_table_commentcCs.d|jj|jddd|j|jjtfS)NzCOMMENT ON COLUMN %s IS %sT) use_tabler)rgrrrxrrQr rR)rorrBrBrFvisit_set_column_comment s  z$DDLCompiler.visit_set_column_commentcCsd|jj|jddS)NzCOMMENT ON COLUMN %s IS NULLT)rU)rgrr)ror2rBrBrFvisit_drop_column_comment sz%DDLCompiler.visit_drop_column_commentcCsd|j|j}|jjdk r.|d|jj7}|jjdk rJ|d|jj7}|jjdk rf|d|jj7}|jjdk r|d|jj7}|jjdk r|d7}|jjdk r|d7}|jj dk r|d|jj 7}|jj d kr|d 7}|jj dk r|d 7}|S) NzCREATE SEQUENCE %sz INCREMENT BY %dz START WITH %dz MINVALUE %dz MAXVALUE %dz NO MINVALUEz NO MAXVALUEz CACHE %dTz ORDERz CYCLE) rgr$rZ incrementstartZminvalueZmaxvalueZ nominvalueZ nomaxvaluecacher4cycle)rorrrBrBrFvisit_create_sequence s*          z!DDLCompiler.visit_create_sequencecCsd|j|jS)NzDROP SEQUENCE %s)rgr$r)ror2rBrBrFvisit_drop_sequence szDDLCompiler.visit_drop_sequencecCs^|j}|jdk r|j|}nd}|dkr:td|jd|j|jj||jrVdpXdfS)Nz szDDLCompiler.post_create_tablecCsPt|jtjrHt|jjtjr2|j|jjt j S|jj |jjddSndSdS)NT)rk) rZserver_defaultrZ DefaultClauseargr Z string_typesrxrr rvrm)rorrBrBrFr` sz%DDLCompiler.get_column_default_stringcCs\d}|jdk r.|j|}|dk r.|d|7}|d|jj|jddd7}|||7}|S)Nr|zCONSTRAINT %s z CHECK (%s)FT)rrk)rrgr]rxrmrdefine_constraint_deferrability)rorrr^rBrBrFvisit_check_constraint s    z"DDLCompiler.visit_check_constraintcCs\d}|jdk r.|j|}|dk r.|d|7}|d|jj|jddd7}|||7}|S)Nr|zCONSTRAINT %s z CHECK (%s)FT)rrk)rrgr]rxrmrrb)rorrr^rBrBrFvisit_column_check_constraint, s    z)DDLCompiler.visit_column_check_constraintcst|dkrdSd}|jdk r>j|}|dk r>|d|7}|d7}|ddfdd|jrd|jn|jD7}||7}|S) Nrr|zCONSTRAINT %s z PRIMARY KEY z(%s)z, c3s|]}j|jVqdS)N)rgrr)rDr)rorBrFrB sz;DDLCompiler.visit_primary_key_constraint..) rrrgr]r*Z_implicit_generatedZcolumns_autoinc_firstr&rb)rorrr^rB)rorFvisit_primary_key_constraint8 s      z(DDLCompiler.visit_primary_key_constraintc s|jd}|jdk r4|j|}|dk r4|d|7}t|jdjj}|ddfdd|jD|||dfdd|jDf7}|| |7}|| |7}|| |7}|S) Nr|zCONSTRAINT %s rz"FOREIGN KEY(%s) REFERENCES %s (%s)z, c3s|]}|jjVqdS)N)rparentr)rDr)rgrBrFrV sz;DDLCompiler.visit_foreign_key_constraint..c3s|]}|jjVqdS)N)rrr)rDr)rgrBrFr\ s) rgrr]rrrr:r*define_constraint_remote_tabledefine_constraint_matchdefine_constraint_cascadesrb)rorrr^Z remote_tablerB)rgrFvisit_foreign_key_constraintL s$   z(DDLCompiler.visit_foreign_key_constraintcCs ||S)z=Format the remote table clause of a CREATE CONSTRAINT clause.)r)rorr:rgrBrBrFrgd sz*DDLCompiler.define_constraint_remote_tablecsht|dkrdSd}|jdk r6j|}|d|7}|ddfdd|D7}||7}|S)Nrr|zCONSTRAINT %s z UNIQUE (%s)z, c3s|]}j|jVqdS)N)rgrr)rDr)rorBrFrq sz6DDLCompiler.visit_unique_constraint..)rrrgr]r*rb)rorrr^rB)rorFvisit_unique_constrainti s    z#DDLCompiler.visit_unique_constraintcCsLd}|jdk r&|d|j|jt7}|jdk rH|d|j|jt7}|S)Nr|z ON DELETE %sz ON UPDATE %s)Zondeletergvalidate_sql_phrase FK_ON_DELETEZonupdate FK_ON_UPDATE)rorrrBrBrFriv s    z&DDLCompiler.define_constraint_cascadescCsLd}|jdk r&|jr|d7}n|d7}|jdk rH|d|j|jt7}|S)Nr|z DEFERRABLEz NOT DEFERRABLEz INITIALLY %s)rr'rgrl FK_INITIALLY)rorrrBrBrFrb s    z+DDLCompiler.define_constraint_deferrabilitycCs d}|jdk r|d|j7}|S)Nr|z MATCH %s)match)rorrrBrBrFrh s z#DDLCompiler.define_constraint_match)N)F)N)FT)F))rrrr rrxrr~r.r0r3r@rDr=rHrIrJrMrNrLrPrSrTrVrWr[r\r_rBr8r>r`rcrdrerjrgrkrirbrhrBrBrBrFr' sH 1  (         r'c@s\eZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!d?d@Z"dAdBZ#dCdDZ$dEdFZ%dGdHZ&dIdJZ'dKdLZ(dMdNZ)dOdPZ*dQdRZ+dSdTZ,dUS)VGenericTypeCompilercKsdS)NZFLOATrB)rorrrBrBrF visit_FLOAT szGenericTypeCompiler.visit_FLOATcKsdS)NZREALrB)rorrrBrBrF visit_REAL szGenericTypeCompiler.visit_REALcKs<|jdkrdS|jdkr&dd|jiSd|j|jdSdS)NZNUMERICzNUMERIC(%(precision)s) precisionz!NUMERIC(%(precision)s, %(scale)s))rtscale)rtru)rorrrBrBrF visit_NUMERIC s  z!GenericTypeCompiler.visit_NUMERICcKs<|jdkrdS|jdkr&dd|jiSd|j|jdSdS)NZDECIMALzDECIMAL(%(precision)s)rtz!DECIMAL(%(precision)s, %(scale)s))rtru)rtru)rorrrBrBrF visit_DECIMAL s  z!GenericTypeCompiler.visit_DECIMALcKsdS)NZINTEGERrB)rorrrBrBrF visit_INTEGER sz!GenericTypeCompiler.visit_INTEGERcKsdS)NZSMALLINTrB)rorrrBrBrFvisit_SMALLINT sz"GenericTypeCompiler.visit_SMALLINTcKsdS)NZBIGINTrB)rorrrBrBrF visit_BIGINT sz GenericTypeCompiler.visit_BIGINTcKsdS)N TIMESTAMPrB)rorrrBrBrFvisit_TIMESTAMP sz#GenericTypeCompiler.visit_TIMESTAMPcKsdS)NZDATETIMErB)rorrrBrBrFvisit_DATETIME sz"GenericTypeCompiler.visit_DATETIMEcKsdS)NZDATErB)rorrrBrBrF visit_DATE szGenericTypeCompiler.visit_DATEcKsdS)NZTIMErB)rorrrBrBrF visit_TIME szGenericTypeCompiler.visit_TIMEcKsdS)NZCLOBrB)rorrrBrBrF visit_CLOB szGenericTypeCompiler.visit_CLOBcKsdS)NZNCLOBrB)rorrrBrBrF visit_NCLOB szGenericTypeCompiler.visit_NCLOBcCs0|}|jr|d|j7}|jr,|d|j7}|S)Nz(%d)z COLLATE "%s")lengthr)rorrrrBrBrF_render_string_type s z'GenericTypeCompiler._render_string_typecKs ||dS)NZCHAR)r)rorrrBrBrF visit_CHAR szGenericTypeCompiler.visit_CHARcKs ||dS)NZNCHAR)r)rorrrBrBrF visit_NCHAR szGenericTypeCompiler.visit_NCHARcKs ||dS)NZVARCHAR)r)rorrrBrBrF visit_VARCHAR sz!GenericTypeCompiler.visit_VARCHARcKs ||dS)NZNVARCHAR)r)rorrrBrBrFvisit_NVARCHAR sz"GenericTypeCompiler.visit_NVARCHARcKs ||dS)NZTEXT)r)rorrrBrBrF visit_TEXT szGenericTypeCompiler.visit_TEXTcKsdS)NZBLOBrB)rorrrBrBrF visit_BLOB szGenericTypeCompiler.visit_BLOBcKsd|jrd|jpdS)NZBINARYz(%d)r|)r)rorrrBrBrF visit_BINARY sz GenericTypeCompiler.visit_BINARYcKsd|jrd|jpdS)NZ VARBINARYz(%d)r|)r)rorrrBrBrFvisit_VARBINARY sz#GenericTypeCompiler.visit_VARBINARYcKsdS)NZBOOLEANrB)rorrrBrBrF visit_BOOLEAN sz!GenericTypeCompiler.visit_BOOLEANcKs|j|f|S)N)r)rorrrBrBrFvisit_large_binary sz&GenericTypeCompiler.visit_large_binarycKs|j|f|S)N)r)rorrrBrBrF visit_boolean sz!GenericTypeCompiler.visit_booleancKs|j|f|S)N)r)rorrrBrBrF visit_time szGenericTypeCompiler.visit_timecKs|j|f|S)N)r})rorrrBrBrFvisit_datetime sz"GenericTypeCompiler.visit_datetimecKs|j|f|S)N)r~)rorrrBrBrF visit_date szGenericTypeCompiler.visit_datecKs|j|f|S)N)rz)rorrrBrBrFvisit_big_integer sz%GenericTypeCompiler.visit_big_integercKs|j|f|S)N)ry)rorrrBrBrFvisit_small_integer sz'GenericTypeCompiler.visit_small_integercKs|j|f|S)N)rx)rorrrBrBrF visit_integer sz!GenericTypeCompiler.visit_integercKs|j|f|S)N)rs)rorrrBrBrF visit_real szGenericTypeCompiler.visit_realcKs|j|f|S)N)rr)rorrrBrBrF visit_float szGenericTypeCompiler.visit_floatcKs|j|f|S)N)rv)rorrrBrBrF visit_numeric sz!GenericTypeCompiler.visit_numericcKs|j|f|S)N)r)rorrrBrBrF visit_string sz GenericTypeCompiler.visit_stringcKs|j|f|S)N)r)rorrrBrBrF visit_unicode sz!GenericTypeCompiler.visit_unicodecKs|j|f|S)N)r)rorrrBrBrF visit_text szGenericTypeCompiler.visit_textcKs|j|f|S)N)r)rorrrBrBrFvisit_unicode_text sz&GenericTypeCompiler.visit_unicode_textcKs|j|f|S)N)r)rorrrBrBrF visit_enum szGenericTypeCompiler.visit_enumcKstd|dS)NzKCan't generate DDL for %r; did you forget to specify a type on this Column?)r r)rorrrBrBrFr" szGenericTypeCompiler.visit_nullcKs|j||jf|S)N)rmZ type_enginere)rorrrBrBrFvisit_type_decorator) sz(GenericTypeCompiler.visit_type_decoratorcKs |jf|S)N)Z get_col_spec)rorrrBrBrFvisit_user_defined, sz&GenericTypeCompiler.visit_user_definedN)-rrrrrrsrvrwrxryrzr|r}r~rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrBrBrBrFrq sT   rqc@seZdZddZddZdS)StrSQLTypeCompilercCs|dr|jSt|dS)NZvisit_) startswith_visit_unknownAttributeError)rorrBrBrF __getattr__1 s zStrSQLTypeCompiler.__getattr__cKs d|jjS)Nz%s)r?r)rorrrBrBrFr7 sz!StrSQLTypeCompiler._visit_unknownN)rrrrrrBrBrBrFr0 src@seZdZdZeZeZeZ e dZ d5ddZ dd Zd d Zd d ZddZddZddZddZd6ddZd7ddZddZd8ddZd9ddZd:d d!Zd;d"d#Zed$d%d&Zd'd(Zdd/d0Z#ej$d1d2Z%d3d4Z&dS)?IdentifierPreparerz@Handle quoting and case-folding of identifiers based on options.N"TFcCsN||_||_|p|j|_||_|jd|_||_||_i|_|jjdk|_ dS)asConstruct 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 )rLrKN) re initial_quote final_quote escape_quoteescape_to_quote omit_schemaquote_case_sensitive_collations_stringsrr)rorerrrrrrBrBrFrqG s  zIdentifierPreparer.__init__cCs,|j|j}|j|jt||_|S)N)r?__new____dict__rr_schema_getterr)rorpZpreprBrBrFrhk s z)IdentifierPreparer._with_schema_translatecCs&||j|j}|jr"|dd}|S)zEscape an identifier. Subclasses should override this to provide database-dependent escaping behavior. rz%%)rrrr)rorrBrBrF_escape_identifierq s z%IdentifierPreparer._escape_identifiercCs||j|jS)zCanonicalize an escaped identifier. Subclasses should override this to provide database-dependent unescaping behavior that reverses _escape_identifier. )rrr)rorrBrBrF_unescape_identifier} sz'IdentifierPreparer._unescape_identifiercCs*|dk r&||s&td||jf|S)zkeyword sequence filter. a filter for elements that are intended to represent keyword sequences, such as "INITIALLY", "INITIALLY DEFERRED", etc. no special characters should be present. .. versionadded:: 1.3 Nz/Unexpected SQL phrase: %r (matching against %r))rpr rpattern)rorZregrBrBrFrl s z&IdentifierPreparer.validate_sql_phrasecCs|j|||jS)z~Quote an identifier. Subclasses should override this to provide database-dependent quoting behavior. )rrr)rorrBrBrFquote_identifier s z#IdentifierPreparer.quote_identifiercCs<|}||jkp:|d|jkp:|jt| p:||kS)z5Return True if the given identifier requires quoting.r)r=reserved_wordsillegal_initial_characterslegal_charactersrpr text_type)rorZlc_valuerBrBrFr s  z#IdentifierPreparer._requires_quotescCs|jt| S)zjReturn True if the given identifier requires quoting, but not taking case convention into account.)rrpr r)rorrBrBrFr; sz1IdentifierPreparer._requires_quotes_illegal_charscCs|dk rtd||S)aConditionally 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)rorforcerBrBrFr szIdentifierPreparer.quote_schemacCs|dk rtdt|dd}|dkrl||jkr:|j|S||rV|||j|<n ||j|<|j|Sn|rz||S|SdS)aConditionally 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 rrrrr)rorrrBrBrFr s       zIdentifierPreparer.quotecCs|jr||S|SdS)N)rr)roZcollation_namerBrBrFr s z#IdentifierPreparer.format_collationcCs>||j}||}|js:|r:|dk r:||d|}|S)Nr)rrrrr)rorDrrrrBrBrFr$s  z"IdentifierPreparer.format_sequencecCs||p |jS)N)rr)rorrrBrBrFrszIdentifierPreparer.format_labelcCs||p |jS)N)rr)rorrrBrBrFr!szIdentifierPreparer.format_aliascCs"|p|j}||r||}|S)N)rrr)roZ savepointrrrBrBrFr$s   z#IdentifierPreparer.format_savepointzsqlalchemy.sql.namingcCst|jtjr>|||j}|dkrDt|jtjr6dS|j}n|j}t|tjr|jdkrl|j j ph|j j }n|j j }t ||kr|d|ddt |dd}n |j |||S)NrrrU)rrrZ _defer_nameZ_constraint_name_for_tabler:Z_defer_none_namerrreZmax_index_name_lengthrrr Zmd5_hexZvalidate_identifierr)roZnamingrrZmax_rBrBrFr]-s"     ( z$IdentifierPreparer.format_constraintcCs ||S)N)r])rorrBrBrFrOKszIdentifierPreparer.format_indexcCsF|dkr|j}||}||}|jsB|rB|rB||d|}|S)z'Prepare a quoted table and schema name.Nr)rrrrr)ror:rrrrrBrBrFrNs  zIdentifierPreparer.format_tablecCs ||S)zPrepare a quoted schema name.)r)rorrBrBrFr/[sz IdentifierPreparer.format_schemacCsp|dkr|j}t|ddsJ|r>|j|j||dd||S||Sn"|rh|j|j||dd|S|SdS)zPrepare a quoted column name.NrF)rrr)rrrr:r)rorrUrZ table_namerrBrBrFr`s    z IdentifierPreparer.format_columncCsD||}|js0|r0|r0|||j|ddfS|j|ddfSdS)z(Format table name and schema as a tuple.F)rN)rrrr)ror:rrrBrBrFr+s  z#IdentifierPreparer.format_table_seqcCs@dd|j|j||jfD\}}}td|||d}|S)NcSsg|]}t|qSrB)rr)rDr$rBrBrFr1sz5IdentifierPreparer._r_identifiers..zM(?:(?:%(initial)s((?:%(escaped)s|[^%(final)s])+)%(final)s|([^\.]+))(?=\.|$))+)initialfinalZescaped)rrrrrr)rorrZ escaped_finalrrBrBrF_r_identifierssz!IdentifierPreparer._r_identifierscs(j}fdddd||DDS)z:Unpack 'schema.table.column'-like strings into components.csg|]}|qSrB)r)rDrH)rorBrFr1sz;IdentifierPreparer.unformat_identifiers..cSsg|]\}}|p|qSrBrB)rDabrBrBrFr1s)rfindall)roZ identifiersrrB)rorFunformat_identifierss z'IdentifierPreparer.unformat_identifiers)rNrTF)N)N)T)N)N)N)TN)FNNF)T)'rrrrRESERVED_WORDSrLEGAL_CHARACTERSrILLEGAL_INITIAL_CHARACTERSrrrrrqrhrrrlrrr;rrrr$rrrr rr]rOrr/rr+rrrrBrBrBrFr; sF       % 2     r)jrrrrr|rrrrrrr r r r r8rrrIrZLEGAL_CHARACTERS_PLUS_SPACEranger=rrmrnroUNICODErrrand_or_addmulrZdivmodtruedivnegltlenegtgeeqZis_distinct_fromZisnot_distinct_fromZ concat_oprbZ notmatch_opZin_opZnotin_opZcomma_oprris_ZisnotrexistsZ distinct_opinvZany_opZall_opZdesc_opZasc_opZ nullsfirst_opZ nullslast_oprrOrrrrr-r.rPrQr7r?ZcubeZrollupZ grouping_setsr>rrraZ UNION_ALLrbZ EXCEPT_ALLrcZ INTERSECT_ALLrobjectrdZwith_metaclassZEnsureKWArgTyperZ Visitablerrr r'rqrrrBrBrBrFs                  =7