
    LȂiMB                       S SK r S SKrS SKJr  S SKJr  S SKJr  S SKJr  S SK	J
r
JrJrJrJrJr  S SKJrJrJr  S SKJrJr  S S	KJr  S S
KJr  S SKJrJr  S SKJr  \ R@                  " S5      r!S r"S r#S r$ " S S5      r%g)    N)datetime)chain)settings)
FieldError)ColumnsExpressionsForeignKeyName	IndexName	StatementTable)names_digestsplit_identifiertruncate_name)
DeferrableIndex)CompositePrimaryKey)Query)TransactionManagementErroratomic)timezonezdjango.db.backends.schemac                     U R                   nUR                  (       a  gUR                  (       a  UR                  S/:X  a  gUR                  UR                  ;   $ )zn
When altering the given field, must constraints on its model from the given
relation be temporarily dropped?
FNT)fieldmany_to_manyprimary_key	to_fieldsname)relationaltered_fieldr   s      OD:\sksbv-state-backend\venv\Lib\site-packages\django/db/backends/base/schema.py_is_relevant_relationr       sG    
 NNE  U__%>00    c           	      r    [        U R                  R                  SSSSS9[        R                  " S5      S9$ )NFT)forwardreverseinclude_hiddeninclude_parentsr   )key)sorted_meta_get_fieldsoperator
attrgettermodels    r   _all_related_fieldsr/   *   sB    !	 	  	
 ' r!   c              #     ^ ^#    [        U 4S j[        T R                  5       5       U4S j[        TR                  5       5       5      nU H2  u  p4X44v   [        UR                  UR                  5       S h  vN   M4     g  N	7f)Nc              3   L   >#    U H  n[        UT5      (       d  M  Uv   M     g 7fNr    ).0obj	old_fields     r   	<genexpr>+_related_non_m2m_objects.<locals>.<genexpr>;   $      	
;$S)4 C;   $	$c              3   L   >#    U H  n[        UT5      (       d  M  Uv   M     g 7fr2   r3   )r4   r5   	new_fields     r   r7   r8   @   r9   r:   )zipr/   r.   _related_non_m2m_objectsremote_field)r6   r<   related_fieldsold_relnew_rels   ``   r   r>   r>   7   s      	
*9??;	

	
*9??;	
N ++    
 	
 	
 +	
s   A6B:B;
Bc                   :   \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrSr\rSrSrSrSrSrSrSrSrSr\rSr\rSrSrSr\r Sr!Sr"Sr#Sr$Sr%\r&Sr'S r(S!r)StS" jr*S# r+S$ r,SuS& jr-S' r.S( r/S) r0SvS* jr1S+ r2S, r3S- r4S. r5S/ r6S0 r7\8S1 5       r9S2 r:S3 r;S4 r<S5 r=S6 r>S7 r?S8 r@S9 rAS: rBS; rCS< rDS= rES> rFS? rGS@ rHSA rISB rJSvSC jrKSD rL SvSE jrMSF rNSvSG jrO SvSH jrPSI rQSJ rRSK rSSL rTSwSN jrUSxSO jrVSP rWSQ rXSSSMSMSS%SS%SSSSR.SS jrYSxST jrZSU r[SV r\SW r]SX r^SxSY jr_SZ r`S[ raS\ rbS] rcS^ rdS_ reS` rfSa rgSb rh     SySc jri      SzSd jrj       S{Se jrkS|Sf jrl      SzSg jrmSh rnSi roSj rpSk rq        S}Sl jrrSm rsSvSn jrtSo ruSp rvS~Sq jrwSuSr jrxSsryg)BaseDatabaseSchemaEditorN   z
This class and its subclasses are responsible for emitting schema-changing
statements to the databases - model creation/removal/alteration, field
renaming, index fiddling, and so on.
z'CREATE TABLE %(table)s (%(definition)s)z1ALTER TABLE %(old_table)s RENAME TO %(new_table)sz7ALTER TABLE %(table)s SET TABLESPACE %(new_tablespace)szDROP TABLE %(table)s CASCADEz:ALTER TABLE %(table)s ADD COLUMN %(column)s %(definition)sz!ALTER TABLE %(table)s %(changes)sz2ALTER COLUMN %(column)s TYPE %(type)s%(collation)sz%ALTER COLUMN %(column)s DROP NOT NULLz$ALTER COLUMN %(column)s SET NOT NULLz/ALTER COLUMN %(column)s SET DEFAULT %(default)sz$ALTER COLUMN %(column)s DROP DEFAULTz,ALTER TABLE %(table)s DROP COLUMN %(column)szDALTER TABLE %(table)s RENAME COLUMN %(old_column)s TO %(new_column)szFUPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULLz"UNIQUE (%(columns)s)%(deferrable)szCHECK (%(check)s)z.ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz"CONSTRAINT %(name)s %(constraint)szPRIMARY KEY (%(columns)s)z?ALTER TABLE %(table)s ADD CONSTRAINT %(name)s CHECK (%(check)s)zbALTER TABLE %(table)s ADD CONSTRAINT %(name)s UNIQUE%(nulls_distinct)s (%(columns)s)%(deferrable)sz|ALTER TABLE %(table)s ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) REFERENCES %(to_table)s (%(to_column)s)%(deferrable)sNzQCREATE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(extra)s%(condition)szaCREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(nulls_distinct)s%(condition)sz/ALTER INDEX %(old_name)s RENAME TO %(new_name)szDROP INDEX %(name)szGALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)zDROP PROCEDURE %(procedure)sz)COMMENT ON TABLE %(table)s IS %(comment)sz5COMMENT ON COLUMN %(table)s.%(column)s IS %(comment)sc                     Xl         X l        U R                  (       a  / U l        U R                   R                  R                  =(       a    UU l        g r2   )
connectioncollect_sqlcollected_sqlfeaturescan_rollback_ddlatomic_migration)selfrG   rH   r   s       r   __init__!BaseDatabaseSchemaEditor.__init__   s;    $&!#D $ 8 8 I I Tfr!   c                     / U l         U R                  (       a>  [        U R                  R                  5      U l        U R                  R                  5         U $ r2   )deferred_sqlrL   r   rG   alias	__enter__)rM   s    r   rS   "BaseDatabaseSchemaEditor.__enter__   s>       !6!67DKKK!!#r!   c                     Uc%  U R                    H  nU R                  US 5        M     U R                  (       a  U R                  R	                  XU5        g g r2   )rQ   executerL   r   __exit__)rM   exc_type	exc_value	tracebacksqls        r   rW   !BaseDatabaseSchemaEditor.__exit__   sH    ((S$' )  KK  i@ !r!    c           	         U R                   (       dK  U R                  R                  (       a0  U R                  R                  R                  (       d  [        S5      e[        U5      n[        R                  SXX!S.S9  U R                   (       a  UR                  5       R                  S5      (       a  SOSnUb?  U R                  R                  U[        [        U R                  U5      5      -  U-   5        gU R                  R                  X-   5        gU R                  R!                  5        nUR#                  X5        SSS5        g! , (       d  f       g= f)z:Execute the given SQL statement, with optional parameters.ziExecuting DDL statements while in a transaction on databases that can't perform a rollback is prohibited.z%s; (params %r))paramsr[   )extra; N)rH   rG   in_atomic_blockrJ   rK   r   strloggerdebugrstripendswithrI   appendtuplemapquote_valuecursorrV   )rM   r[   r_   endingrm   s        r   rV    BaseDatabaseSchemaEditor.execute   s   
   //OO,,==,? 
 #hsV2P 	 	
 ::<0055R3F!""))5T%5%5v!>??6I ""))#,7'')Vs+ *))s   2E
Ec                 L    U R                   R                  R                  U5      $ r2   )rG   ops
quote_name)rM   r   s     r   rr   #BaseDatabaseSchemaEditor.quote_name   s    ""--d33r!   c                 4	  ^ ^ TR                   R                   HX  nU Vs/ sH  nTR                   R                  U5      PM      nnT R                  R	                  T R                  TU5      5        MZ     / n/ nTR                   R                   GHs  nT R                  TU5      u  pxUc  M  UR                  T R                  S9n	U	S   (       a  UST R                  U	-  -   -  nUR                  T R                  S9n
U
(       a  USU
-  -  nUR                  U5        UR                  (       Ga"  UR                  (       Ga  UR                  R                  R                   R                   nUR                  R                  R                   R                  UR                  R"                  5      R$                  nT R&                  (       a7  UST R&                  T R)                  U5      T R)                  U5      S.-  -   -  nOQT R                  R*                  R,                  (       a,  T R                  R	                  T R/                  TUS5      5        UR	                  T R)                  UR$                  5      < SU< 35        UR1                  5       S;   d  GM
  T R                  R2                  R5                  TR                   R                   UR$                  5      nU(       d  GMX  T R                  R                  U5        GMv     / nU(       aI  TR                   R6                   H.  nT R                  R	                  UR9                  TT 5      5        M0     O0UR                  UU 4S jTR                   R6                   5       5        TR                   R:                  n[=        U[>        5      (       a*  UR	                  T RA                  URB                  5      5        T RD                  T R)                  TR                   R                   5      S	RG                  S
 / UQUQ7 5       5      S.-  nTR                   RH                  (       aH  T R                  R2                  RK                  TR                   RH                  5      nU(       a  USU-   -  nUU4$ s  snf )z-Take a model and return its table definition.rG   check z %s)to_table	to_column_fk_%(to_table)s_%(to_column)s)	AutoFieldBigAutoFieldSmallAutoFieldc              3   F   >#    U H  nUR                  TT5      v   M     g 7fr2   )constraint_sql)r4   
constraintr.   rM   s     r   r7   5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>  s(      #"9J ))%66"9s   !, c              3   H   #    U H  nU(       d  M  [        U5      v   M     g 7fr2   )rd   )r4   	statements     r   r7   r   '  s"      $!AI I!As   
"")table
definition)&r)   unique_together	get_fieldrQ   ri   _create_unique_sqllocal_fields
column_sqldb_parametersrG   sql_check_constraintdb_type_suffixextendr?   db_constraintr.   db_table
field_namecolumnsql_create_inline_fkrr   rJ   supports_foreign_keys_create_fk_sqlget_internal_typerq   autoinc_sqlconstraints
create_sqlpk
isinstancer   _pk_constraint_sqlcolumnssql_create_tablejoindb_tablespacetablespace_sql)rM   r.   field_namesr   fieldscolumn_sqlsr_   r   extra_params	db_paramscol_type_suffixrx   ry   r   constraint_sqlsr   r   r[   r   s   ``                 r   	table_sql"BaseDatabaseSchemaEditor.table_sql   s    !;;66K@KLuekk++E2FL$$T%<%<UF%KL 7 [[--E'+ue'D$J!++t+GI!cD$=$=	$III
#22doo2NOeo55
MM,'!!!e&9&9&9 --3399BB!..44::DD&&11&  ,,#(A(A$(OOH$=%)__Y%?E ) # J __--CC%%,,++!5*J  OOELL1 &&( - 
 #oo11==KK((%,, ;%%,,[9e .p  $kk55
!!(()>)>ud)KL 6 "" #"'++"9"9# 
 [[^^b-..""4#:#:2::#FG##__U[[%9%9:)) $!A;!A!A$ '
 
 ;;$$!__00??))N s^++F{y Ms   $Rc              #     #    Uv   UR                  S5      =n(       a  U R                  U5      v   UR                  nUR                  5       (       a-  U R	                  U5      u  pSU	 3v   UR                  U
5        SnU=(       a<    U R                  U5      (       + =(       a    U=(       a    U R                  U5      (       + nU(       ax  U R                  U5      nUbd  SU R                  U5      -   nU R                  R                  R                  (       a  XR                  U5      -  v   OUv   UR                  U5        UR                  (       a8  UR                   (       d'  U R                  R                  R"                  (       a  SnUR$                  (       a)  U R'                  U5      u  pUR                  U5        Uv   O5U(       d  Sv   O)U R                  R                  R(                  (       d  Sv   UR                   (       a  Sv   OUR*                  (       a  Sv   UR,                  =(       d    UR.                  R,                  nU(       a\  U R                  R                  R0                  (       a7  UR*                  (       a&  U R                  R2                  R5                  USS	9v   U R                  R                  R6                  (       a0  UR8                  (       a  U R;                  UR8                  5      v   g g g 7f)
N	collationzDEFAULT FTzNOT NULLNULLzPRIMARY KEYUNIQUE)inline)get_collate_sqlnullhas_db_defaultdb_default_sqlr   skip_defaultskip_default_on_altereffective_default_column_default_sqlrG   rJ   requires_literal_defaultsprepare_defaultri   empty_strings_allowedr   !interprets_empty_strings_as_nulls	generated_column_generated_sqlimplied_column_nulluniquer   r)   supports_tablespacesrq   r   supports_comments_inline
db_comment_comment_sql)rM   column_db_typer_   r.   r   field_db_paramsinclude_defaultr   r   default_sqldefault_paramsdefault_valuecolumn_defaultgenerated_sqlgenerated_params
tablespaces                   r   _iter_column_sql)BaseDatabaseSchemaEditor._iter_column_sql7  sM     '++K8898##I..zz!!*.*=*=e*D'K[M**MM.)#O  =%%e,,= ;$44U;< 	  2259M(!+d.F.Fu.M!M??++EE )+?+?+NNN((MM-0 ''%%((JJD??.2.H.H.O+MMM*+))==L\\N((EEKK,E,E
((==//%%44Z4MM??##<<AQAQ##E$4$455 BR<s   LL	c           
          UR                  U R                  S9nUS   nUc  g/ nSR                  U R                  UUUUUU5      5      U4$ )zn
Return the column definition for a field. The field must already have
had set_attributes_from_name() called.
ru   typeNNrw   )r   rG   r   r   )rM   r.   r   r   r   r   r_   s          r   r   #BaseDatabaseSchemaEditor.column_sqlz  sn      ---I(0!HH%%"##
 
 	
r!   c                     g)zi
Some backends don't accept default values for certain columns types
(i.e. MySQL longtext and longblob).
Fr]   rM   r   s     r   r   %BaseDatabaseSchemaEditor.skip_default      
 r!   c                     g)z
Some backends don't accept default values for certain columns types
(i.e. MySQL longtext and longblob) in the ALTER COLUMN statement.
Fr]   r   s     r   r   .BaseDatabaseSchemaEditor.skip_default_on_alter  r   r!   c                     [        S5      e)zE
Only used for backends which have requires_literal_defaults feature
zsubclasses of BaseDatabaseSchemaEditor for backends which have requires_literal_defaults must provide a prepare_default() methodNotImplementedErrorrM   values     r   r   (BaseDatabaseSchemaEditor.prepare_default  s     "P
 	
r!   c                     g)zx
Return the SQL to use in a DEFAULT clause. The resulting string should
contain a '%s' placeholder for a default value.
%sr]   r   s     r   r   ,BaseDatabaseSchemaEditor._column_default_sql  s    
 r!   c                 v  ^  SSK Jn  UR                  n[        X25      (       a  T R	                  U5      OSn[        UR                  S9nUR                  T R                  S9nUR                  U5      u  pxT R                  R                  R                  (       a  U[        U 4S jU 5       5      -  n/ nXG-  U4$ )z;Return the sql and params for the field's database default.r   )Valuez(%s)r-   ru   c              3   D   >#    U H  nTR                  U5      v   M     g 7fr2   )r   r4   prM   s     r   r7   :BaseDatabaseSchemaEditor.db_default_sql.<locals>.<genexpr>  s      I&Q!5!5a!8!8&    )django.db.models.expressionsr   _db_default_expressionr   r   r   r.   get_compilerrG   compilerJ   r   rj   )	rM   r   r   
db_defaultr[   querycompilerr   r_   s	   `        r   r   'BaseDatabaseSchemaEditor.db_default_sql  s    611
/9*/L/LD$$U+RX 	 EKK(%%%A&..z:??##== 5 I& IIIKF &((r!   c                    ^  UR                  T R                  5      u  p#UR                  (       a  SOSnT R                  R                  R                  (       a  U[        U 4S jU 5       5      -  nSnSU SU 3U4$ )z3Return the SQL to use in a GENERATED ALWAYS clause.STOREDVIRTUALc              3   D   >#    U H  nTR                  U5      v   M     g 7fr2   rl   r   s     r   r7   ABaseDatabaseSchemaEditor._column_generated_sql.<locals>.<genexpr>  s!     3XQWAD4D4DQ4G4GQWr   r]   zGENERATED ALWAYS AS (z) )r   rG   
db_persistrJ   r   rj   )rM   r   expression_sqlr_   persistency_sqls   `    r   r   .BaseDatabaseSchemaEditor._column_generated_sql  sq    !&!4!4T__!E&+&6&6(I??##==+e3XQW3X.XXNF&~&6b8IJFRRr!   c                 N   U R                  5       (       a  U R                  5       nU$ U R                  (       a  S nU$ U R                  (       d?  U R                  (       a.  U R
                  (       a  U R                  5       S:X  a  SnU$ Sn U$ [        U SS5      (       d  [        U SS5      (       ar  U R                  5       nUS:X  a  [        R                  " 5       nU$ [        R                  " 5       nUS:X  a  UR                  5       nU$ US	:X  a  UR                  5       nU$ S nU$ )
NBinaryFieldr!   rb   auto_nowFauto_now_addDateTimeField	DateField	TimeField)has_defaultget_defaultr   r   blankr   r   getattrr   nowr   datetime)r   defaultinternal_types      r   _effective_default+BaseDatabaseSchemaEditor._effective_default  s    '')G( ' __G$ # 0K0K&&(M9    UJ..'%QV2W2W!335M/",,.  #,,. K/%llnG
 	 #k1%llnG  Gr!   c                 X    UR                  U R                  U5      U R                  5      $ )z2Return a field's effective database default value.)get_db_prep_saver  rG   r   s     r   r   *BaseDatabaseSchemaEditor.effective_default  s$    %%d&=&=e&DdooVVr!   c                     [        5       e)a(  
Return a quoted version of the value so it's safe to use in an SQL
string. This is not safe against injection from user code; it is
intended only for use in making SQL scripts or preparing default values
for particularly tricky backends (defaults are not user-defined,
though, so this is safe).
r   r   s     r   rl   $BaseDatabaseSchemaEditor.quote_value  s     "##r!   c           	         U R                  U5      u  p#U R                  X#=(       d    S5        U R                  R                  R                  (       a  UR
                  R                  (       a'  U R                  USUR
                  R                  5        U R                  R                  R                  (       dw  UR
                  R                   H]  nUR                  (       d  M  UR                  U R                  S9nUS   nU R                  " U R                  XXdR                  5      6   M_     U R                  R                  U R                  U5      5        UR
                  R                    HY  nUR"                  R$                  R
                  R&                  (       d  M4  U R)                  UR"                  R$                  5        M[     g)zZ
Create a table and any accompanying indexes or unique constraints for
the given `model`.
Nru   r   )r   rV   rG   rJ   supports_commentsr)   db_table_commentalter_db_table_commentr   r   r   r   _alter_column_comment_sqlrQ   r   _model_indexes_sqllocal_many_to_manyr?   throughauto_createdcreate_model)rM   r.   r[   r_   r   r   
field_types          r   r  %BaseDatabaseSchemaEditor.create_model  sQ   
 nnU+ 	S.D)??##55{{++++E49U9UV??++DD"[[55E'''*/*=*='+ +> + &5V%<
!;; %j:J:J 6 	  !8!8!?@ [[33E!!))//<<<!!%"4"4"<"<= 4r!   c                 d   UR                   R                   HY  nUR                  R                  R                   R                  (       d  M4  U R                  UR                  R                  5        M[     U R                  U R                  SU R                  UR                   R                  5      0-  5        [        U R                  5       Ha  n[        U[        5      (       d  M  UR                  UR                   R                  5      (       d  MF  U R                  R                  U5        Mc     g)z!Delete a model from the database.r   N)r)   r  r?   r  r  delete_modelrV   sql_delete_tablerr   r   listrQ   r   r   references_tableremove)rM   r.   r   r[   s       r   r"  %BaseDatabaseSchemaEditor.delete_model  s     [[33E!!))//<<<!!%"4"4"<"<= 4
 	!!)=)=>	
 ))*C#y))c.B.B$$/ / !!((-	 +r!   c                     UR                   (       a&  U R                  R                  R                  (       d  gU R	                  UR                  X5      SS9  g)zAdd an index on a model.Nr_   )contains_expressionsrG   rJ   supports_expression_indexesrV   r   rM   r.   indexs      r   	add_index"BaseDatabaseSchemaEditor.add_index1  s@     &&OO,,HH 	U%%e24@r!   c                     UR                   (       a&  U R                  R                  R                  (       d  gU R	                  UR                  X5      5        g)zRemove an index from a model.N)r*  rG   rJ   r+  rV   
remove_sqlr,  s      r   remove_index%BaseDatabaseSchemaEditor.remove_index<  s:     &&OO,,HHU%%e23r!   c                     U R                   R                  R                  (       a5  U R                  U R	                  XR
                  UR
                  5      S S9  g U R                  X5        U R                  X5        g )Nr)  )rG   rJ   can_rename_indexrV   _rename_index_sqlr   r2  r.  )rM   r.   	old_index	new_indexs       r   rename_index%BaseDatabaseSchemaEditor.rename_indexE  s]    ??##44LL&&unninnM  
 e/NN5,r!   c                 V    UR                  X5      nU(       a  U R                  USS9  gg)zAdd a constraint to a model.Nr)  )r   rV   rM   r.   r   r[   s       r   add_constraint'BaseDatabaseSchemaEditor.add_constraintO  s,    ##E0 LLTL* r!   c                 X    UR                  X5      nU(       a  U R                  U5        gg)z!Remove a constraint from a model.N)r1  rV   r<  s       r   remove_constraint*BaseDatabaseSchemaEditor.remove_constraintW  s&    ##E0LL r!   c                    U Vs1 sH  n[        U5      iM     nnU Vs1 sH  n[        U5      iM     nnUR                  U5       H$  nU R                  UUSSS.U R                  5        M&     UR                  U5       HL  nU Vs/ sH  oR                  R                  U5      PM     nnU R                  U R                  X5      5        MN     gs  snf s  snf s  snf )z
Deal with a model changing its unique_together. The input
unique_togethers must be doubly-nested, not the single-nested
["foo", "bar"] format.
TF)r   r   N)rj   
difference_delete_composed_indexsql_delete_uniquer)   r   rV   r   )	rM   r.   old_unique_togethernew_unique_togetherr   oldsnewsr   r   s	            r   alter_unique_together.BaseDatabaseSchemaEditor.alter_unique_together]  s     -@@,?&f,?@,?@,?&f,?@ood+F''6&&	 ,  ??40K@KLukk++E2FLLL00?@ 1 A@ Ms   CC#Cc           	         U Vs1 sH  n[        U5      iM     nnU Vs1 sH  n[        U5      iM     nnUR                  U5       H$  nU R                  UUSSS.U R                  5        M&     UR                  U5       HK  nU Vs/ sH  oR                  R                  U5      PM     nnU R                  U R                  XSS95        MM     gs  snf s  snf s  snf )z
Deal with a model changing its index_together. The input
index_togethers must be doubly-nested, not the single-nested
["foo", "bar"] format.
TF)r-  r   _idx)r   suffixN)rj   rC  rD  sql_delete_indexr)   r   rV   _create_index_sql)	rM   r.   old_index_togethernew_index_togetherr   rH  rI  r   r   s	            r   alter_index_together-BaseDatabaseSchemaEditor.alter_index_togetherr  s     -??,>&f,>?,>?,>&f,>?ood+F''%0%%	 ,  ??40K@KLukk++E2FLLL//V/TU 1 @? Ms   CC#Cc           
      J   UR                   R                   Vs1 sH  oUR                  iM     nnUR                   R                   Vs1 sH  oUR                  iM     nnU Vs/ sH'  oR                   R	                  U5      R
                  PM)     n	nU R                  " UU	4SXg-  0UD6n
UR                  S5      SL ab  U
(       a[  U R                  R                  R                  (       a6  [        U R                  UR                   R                  U	SS95      nX;   a  U/n
[        U
5      S:w  aD  [        S[        U
5      < SUR                   R                  < S	S
R!                  U	5      < S35      eU R#                  U R%                  XAU
S   5      5        g s  snf s  snf s  snf )Nexcluder   TFquote   Found wrong number (z) of constraints for (r   )r   )r)   r   r   indexesr   r   _constraint_namesr   rG   rJ   *allows_multiple_constraints_on_same_fieldsrd   _unique_constraint_namer   len
ValueErrorr   rV   _delete_constraint_sql)rM   r.   r   constraint_kwargsr[   r   meta_constraint_namesmeta_index_namesr   r   constraint_namesdefault_names               r   rD  /BaseDatabaseSchemaEditor._delete_composed_index  s   .3kk.E.E!
.E
OO.E 	 !
 ?Dkk>Q>QR>Q
OO>QRDJKF5;;((/66FK11
 *<
  	
 !!(+t3 ((SS ,,U[[-A-A7RW,XL /$0>  A% ()KK((IIg&	  	T00=Ma=PQR?!
 SKs   FF!-F c                    X#:X  dG  U R                   R                  R                  (       a#  UR                  5       UR                  5       :X  a  gU R	                  U R
                  U R                  U5      U R                  U5      S.-  5        U R                   H+  n[        U[        5      (       d  M  UR                  X#5        M-     g)z#Rename the table a model points to.N)	old_table	new_table)rG   rJ   ignores_table_name_caselowerrV   sql_rename_tablerr   rQ   r   r   rename_table_references)rM   r.   old_db_tablenew_db_tabler[   s        r   alter_db_table'BaseDatabaseSchemaEditor.alter_db_table  s    'OO$$<<""$(:(:(<<!!!__\:!__\:	
 $$C#y))++LG %r!   c                 ,   U R                   (       a  U R                  R                  R                  (       a]  U R	                  U R                   U R                  UR                  R                  5      U R                  U=(       d    S5      S.-  5        g g g )Nrb   )r   comment)	sql_alter_table_commentrG   rJ   r  rV   rr   r)   r   rl   )rM   r.   old_db_table_commentnew_db_table_comments       r   r  /BaseDatabaseSchemaEditor.alter_db_table_comment  so    ''DOO,D,D,V,VLL,,!__U[[-A-AB#//0D0JK -W'r!   c                     U R                  U R                  U R                  UR                  R                  5      U R                  U5      U R                  U5      S.-  5        g)z)Move a model's table between tablespaces.)r   old_tablespacenew_tablespaceN)rV   sql_retablespace_tablerr   r)   r   )rM   r.   old_db_tablespacenew_db_tablespaces       r   alter_db_tablespace,BaseDatabaseSchemaEditor.alter_db_tablespace  sQ    '')=)=>"&//2C"D"&//2C"D	
r!   c           
      $	   UR                   (       aT  UR                  R                  R                  R                  (       a%  U R                  UR                  R                  5      $ U R                  XSS9u  p4Uc  gUR                  U R                  S9=n(       a  USU 3-  nUR                  U R                  S9nUS   (       a  USU R                  U-  -   -  nUR                  (       Ga  U R                  R                  R                  (       Ga  UR                  (       Gax  SnU R                  (       Ga9  UR                  R                  R                  R                   nUR                  R                  R                  R#                  UR                  R$                  5      R&                  n	[)        UR                  R                   5      u  pUSU R                  U R+                  XU5      U
(       a  SU R-                  U
5      -  OS	U R-                  UR&                  5      U R-                  U5      U R-                  U	5      U R                  R.                  R1                  5       S
.-  -   -  nO+U R2                  R5                  U R7                  XU5      5        U R8                  U R-                  UR                  R                   5      U R-                  UR&                  5      US.-  nU R;                  X=(       d    S5        UR=                  5       (       d  U R?                  U5      (       dl  U RA                  U5      bZ  U RC                  USUSS9u  pU RD                  U R-                  UR                  R                   5      US.-  nU R;                  X5        URF                  (       ax  U R                  R                  RH                  (       aS  U R                  R                  RJ                  (       d.  US   nU R:                  " U RM                  XXRF                  5      6   U R2                  RO                  U RQ                  X5      5        U R                  R                  RR                  (       a  U R                  RU                  5         gg)zw
Create a field on a model. Usually involves adding a column, but may
involve adding a table instead (for M2M fields).
T)r   Nru   rw   rv   rz   z%s.rb   )r   	namespacer   rx   ry   
deferrable)r   r   r   dropr   changesr   )+r   r?   r  r)   r  r  r   r   rG   r   r   rJ   r   r   sql_create_column_inline_fkr.   r   r   r   r   r   _fk_constraint_namerr   rq   deferrable_sqlrQ   ri   r   sql_create_columnrV   r   r   r   _alter_column_default_sqlsql_alter_columnr   r  r   r  r   _field_indexes_sqlconnection_persists_old_columnsclose)rM   r.   r   r   r_   r   r   constraint_suffixrx   ry   r  _r[   changes_sqlr  s                  r   	add_field"BaseDatabaseSchemaEditor.add_field  s    %"4"4"<"<"B"B"O"O$$U%7%7%?%?@@!__U4_P
#22doo2NN?NAo.//J''4??'C	W# 9 9I EEEJ((>>>### @/// --3399BB!..44::DD&&11&   00D0DE	cD$D$D 44UCTU>G	 ::R"ooell; $ 9!%!;"&//"5"5"D"D"F	H 	% 	 	
 !!((''6GH $$__U[[%9%9:ooell3$(
 
 	S.D) $$&&..u55&&u-9"&"@"@tU #A #K '')=)=>&+ C LL% ((::OO,,EE"6*JLL//*.>.> 	  !8!8!FG??##CCOO!!# Dr!   c                    UR                   (       aT  UR                  R                  R                  R                  (       a%  U R                  UR                  R                  5      $ UR                  U R                  S9S   c  gUR                  (       aD  U R                  XR                  /SS9nU H#  nU R                  U R                  X5      5        M%     U R                  U R                  UR                  R                  5      U R                  UR                  5      S.-  nU R                  U5        U R                  R                  R                   (       a  U R                  R#                  5         [%        U R&                  5       Hl  n[)        U[*        5      (       d  M  UR-                  UR                  R                  UR                  5      (       d  MQ  U R&                  R/                  U5        Mn     g)zm
Remove a field from a model. Usually involves deleting a column,
but for M2Ms may involve deleting a table.
ru   r   NTforeign_key)r   r   )r   r?   r  r)   r  r"  r   rG   r^  r   rV   _delete_fk_sqlsql_delete_columnrr   r   rJ   r  r  r$  rQ   r   r   references_columnr&  )rM   r.   r   fk_namesfk_namer[   s         r   remove_field%BaseDatabaseSchemaEditor.remove_field)  su    %"4"4"<"<"B"B"O"O$$U%7%7%?%?@@$//:6BJ--ell^QU-VH#T00@A $ $$__U[[%9%9:ooell3(
 
 	S??##CCOO!!#))*C#y))c.C.C$$ell/ / !!((-	 +r!   c           
         U R                  X#5      (       d  gUR                  U R                  S9nUS   nUR                  U R                  S9nUS   nSn	Uc  UR                  b  Uc!  UR                  c  [	        SU< SU< S35      eUc  Uc  UR                  R
                  (       a  UR                  R
                  (       ap  UR                  R
                  R                  R                  (       aA  UR                  R
                  R                  R                  (       a  U R                  XX45      $ Uc  Uc  UR                  R
                  (       az  UR                  R
                  (       a_  UR                  R
                  R                  R                  (       d0  UR                  R
                  R                  R                  (       d  gUb  Uc  [	        SU< SU< S35      eUR                  UR                  :w  d+  UR                  (       a  UR                  UR                  :w  a  S	n	OLUR                  (       a;   UR                  U R                  5      n
UR                  U R                  5      nX:g  n	U	(       a  [	        S
U S35      eU R                  UUUUUUUU5        g! [         a    S	n	 N=f = f)z
Allow a field's type, uniqueness, nullability, default, column,
constraints, etc. to be modified.
`old_field` is required to compute the necessary changes.
If `strict` is True, raise errors if the old column does not match
`old_field` precisely.
Nru   r   FzCannot alter field z into zT - they do not properly define db_type (are you using a badly-written custom field?)zr - they are not compatible types (you cannot alter to or from M2M fields, or add or remove through= on M2M fields)Tz7Modifying GeneratedFields is not supported - the field z6 must be removed and re-added with the new definition.)_field_should_be_alteredr   rG   r?   rb  r  r)   r  _alter_many_to_manyr   r   r   r   _alter_field)rM   r.   r6   r<   strictold_db_paramsold_typenew_db_paramsnew_typemodifying_generated_fieldold_field_sqlnew_field_sqls               r   alter_field$BaseDatabaseSchemaEditor.alter_fieldI  sy    ,,YBB!//4??/K (!//4??/K ($)!!7!7!?!7!7!? i)   &&..**22**2288EE**2288EE ++EiPP &&..**22!..66<<II!..66<<II !1 .7	C 
   I$7$77I$8$8I<P<P$P(,%  K ) 7 7 H
 !* 7 7 H,9,J)$I) UH H 
 			
  1,0)1s   J. .J=<J=c                     U R                   R                  nUR                  U R                   5      nSUS'    X1R                  5          U-  $ ! [         a     g f = f)N__column_name__r   )rG   data_type_check_constraintsdb_type_parametersr   KeyError)rM   r   r   check_constraintsdatas        r   _field_db_check(BaseDatabaseSchemaEditor._field_db_check  s_     !OOGG''8*X	$%<%<%>?$FF 		s   A 
AAc	           	          [        5       n	U R                  R                  R                  (       a  UR                  (       a  UR
                  (       a  U R                  UUS1S9(       a  U R                  XR                  /SS9n
U(       aM  [        U
5      S:w  a>  [        S[        U
5      < SUR                  R                  < SUR                  < 35      eU
 H?  nU	R                  UR                  45        U R                  U R                  X5      5        MA     UR                   (       a  UR                   (       a  U R#                  X#5      (       a  UR                  R$                   Vs1 sH  oR&                  iM     nnU R                  UUR                  /SS	US
9nU(       aM  [        U5      S:w  a>  [        S[        U5      < SUR                  R                  < SUR                  < 35      eU H#  nU R                  U R)                  X5      5        M%     UR+                  S5      nUR+                  S5      nU R                  R                  R                  =(       a\    UR,                  =(       a    UR,                  =(       d    UR                   =(       a    UR                   =(       a    XE:g  =(       d    UU:g  nU(       ay  [/        X#5       Hj  u  nnU R                  UR0                  UR2                  R                  /SS9nU H.  nU R                  U R                  UR0                  U5      5        M0     Ml     UR4                  (       a  UR                   (       d  UR4                  (       a  UR                   (       a  UR                  R6                   Vs1 sH  nUR&                  iM     nnU R                  UUR                  /S[8        R:                  US9nU H$  nU R                  U R=                  UU5      5        M&     U R?                  X&5      nU R?                  X75      nUU:w  a  U(       a  UR                  R$                   Vs1 sH  oR&                  iM     nnU R                  UUR                  /SUS9nU(       aM  [        U5      S:w  a>  [        S[        U5      < SUR                  R                  < SUR                  < 35      eU H#  nU R                  U RA                  X5      5        M%     UR                  UR                  :w  a  U R                  U RC                  UR                  R                  X#U5      5        U RD                   HU  n[G        U[H        5      (       d  M  URK                  UR                  R                  UR                  UR                  5        MW     / n/ n/ nURM                  U R                  S9n URM                  U R                  S9n!XE:w  dK  U U!:w  dE  UU:w  d?  U R                  R                  RN                  (       aS  URP                  URP                  :w  a9  U RS                  XX5UU5      u  n"n#URU                  U"5        URW                  U#5        URY                  5       (       aQ  URY                  5       (       a  URZ                  URZ                  :w  a!  URU                  U R]                  XU5      5        O5URY                  5       (       a   URU                  U R]                  XUSS95        S	n$UR^                  (       a  UR^                  (       dy  URY                  5       (       dd  U Ra                  U5      n%U Ra                  U5      n&U Rc                  U5      (       d,  U%U&:w  a&  U&b#  Sn$URU                  U Re                  XU5      5        UR^                  UR^                  :w  a*  U Rg                  XU5      n"U"(       a  URU                  U"5        URi                  5       =(       d    URY                  5       =(       a$    UR^                  =(       a    UR^                  (       + n'U(       d  U(       Ga  U'(       d  UU-  nU R                  R                  Rj                  (       a>  U(       a7  [m        [o        U6 5      u  nn(SRq                  U5      [m        [s        U(6 5      4/nU HK  u  nn(U R                  U Rt                  U Rw                  UR                  R                  5      US.-  U(5        MM     U'(       a  URY                  5       (       d  Sn)W&/n(OU Ry                  U5      u  n)n(U R                  U Rz                  U Rw                  UR                  R                  5      U Rw                  UR                  5      U)S.-  U(5        U HK  u  nn(U R                  U Rt                  U Rw                  UR                  R                  5      US.-  U(5        MM     U(       a  U H  u  nn(U R                  UU(5        M     UR,                  (       a"  UR,                  (       d  U R}                  X5        U R                  X#5      (       a!  U R                  U R                  X/5      5        UR4                  (       a  UR                   (       aA  UR4                  (       a0  UR                   (       d  U R                  U R                  X/S95        / n*U(       a  U*RW                  [/        X#5      5        U R#                  X#5      (       a:  U R                  U R                  X5      5        U*RW                  [/        X#5      5        U* GH  u  n+nUR2                  R                  U R                  S9n,U,S   n-U,R+                  S5      n.U+R2                  R                  U R                  S9n/U/R+                  S5      n0U RS                  UR0                  U+R2                  UR2                  U-U0U.5      u  n"n#U R                  U Rt                  U Rw                  UR0                  R                  R                  5      U"S   S.-  U"S   5        U# H  u  nn(U R                  UU(5        M     GM!     U R                  R                  R                  (       al  UR                  (       a[  U	(       d"  UR                  (       a  UR
                  (       d2  UR
                  (       a!  U R                  U R                  XS5      5        U(       a_  U* HY  u  n1n2U2R2                  R
                  (       d  M#  U R                  U R                  U2R0                  U2R2                  S5      5        M[     UU:w  a[  U(       aT  U R                  UR                  R                  UR                  /SS9nU R                  U R                  XUS   5      5        U$(       a[  U Re                  XUSS9u  n3n(U Rt                  U Rw                  UR                  R                  5      U3S.-  nU R                  UU(5        U R                  R                  R                  (       a  U R                  R                  5         ggs  snf s  snf s  snf )z3Perform a "physical" (non-ManyToMany) field update.r   )ignoreTr  rY  rZ  z!) of foreign key constraints for .F)r   r   rV  z) of unique constraints for r   )r-  type_rV  )rv   rV  z) of check constraints for ru   r  Nr   r  r   )r   r   r  r   r   r   rz   _fk_checkrN  rv   )IsetrG   rJ   r   r?   r   r  r^  r   ra  rb  r)   r   addrV   r  r   _field_became_primary_keyr   r   _delete_unique_sqlr   r   r>   related_modelr   db_indexr]  r   rN  _delete_index_sqlr  _delete_check_sql_rename_field_sqlrQ   r   r   rename_column_referencesr   r  r   _alter_column_type_sqlri   r   r   r   "_alter_column_database_default_sqlr   r   r   r  _alter_column_null_sqlr  supports_combined_altersrj   r=   r   r   r  rr   r   sql_update_with_default_delete_primary_key_unique_should_be_addedr   rP  _create_primary_key_sqlr   r   _create_index_name_create_check_sqlr  r  )4rM   r.   r6   r<   r  r  r  r  r  fks_droppedr  r  r   re  rg  constraint_nameold_collationnew_collationdrop_foreign_keys_old_relrB   rel_fk_namesr-  rf  index_names
index_nameold_db_checknew_db_checkr[   actionsnull_actionspost_actionsold_type_suffixnew_type_suffixfragmentother_actionsneeds_database_defaultold_defaultnew_defaultfour_way_default_alterationr_   r   rels_to_updaterA   rel_db_paramsrel_typerel_collationold_rel_db_paramsold_rel_collationr  relr  s4                                                       r   r  %BaseDatabaseSchemaEditor._alter_field  sP    eOO$$::&&''--$~ .  --(()t . H #h-1,  H,,!((	  $!1!1 34T00@A $   D$B$B9$X$X 38++2I2I%2IJ2I " %  $55!!"!-  6   #./14  ,-,,!((	  $4T44ULM $4 &))+6%))+6OO$$:: M&&@9+@+@ ;$$9)9)9M
 &KM],J 	  &>i%S!'#55))GMM,@,@+At  6    ,GLL!4!4W5J5JG!TU  ,	 &T$ $$''9+;+; 9>8K8KL8Ku

8KL 00!!"ll( 1 K *
 T33E:FG	 * ++IE++IE<'L27++2I2I%2IJ2I " %  $55!!"-	  6   #./14  ,-,,!((	  $4T33EKL $4 y///LL&&KK(() ((c9--00,,i.>.>	@P@P ) #22doo2N#22doo2N  /1-((::((I,@,@@ '+&A&A)}m'#Hm NN8$.##%%,,..''9+?+??;;EiX %%''NN77id 8  "'>>)..9Q9Q9S9S00;K00;K..y99;.+)-&225YO >>Y^^+225YOH##H- !!#Ay'?'?'A'6~~4inn"4 	$ l. <'''@@W#CM2V IIcNE%.,ABC&V))!%1E1E!F#&
   ' + //11"&K)]F*.*=*=i*H'K00!%1E1E!F"&//)2B2B"C#.  $0KCLL--%)__U[[5I5I%J'*
  $0 +VS&)  ,   )>)>$$U3''	==LL00DE ##y'7'7""$$LL//k/JK !!":9"PQ)))??LL55eGH!!":9"PQ !/GW#MM774??7SM$V,H)--k:M ' ; ;t ; W 1 5 5k B&*&A&A%%!'#Hm LL%%!__W-B-B-H-H-Q-QR'{
   -VS&)  -- !/4 OO$$::&&9#9#9AXAX''LL##E6VW (399***LL++C,=,=syy%P ) <'L"55$$y'7'7&8 6 O LL&&u}W?UV
 ""&"@"@)$ #A #K '')=)=>&+ C LLf%??##CCOO!!# DI
%v  M&%s   -zzzc                 @   U R                   R                  R                  (       a  UR                  (       a  gUR	                  U R                   S9nUR
                  (       a  U R                  OU R                  nUU R                  UR                  5      US   S.-  / 4$ )z
Hook to specialize column null alteration.

Return a (sql, params) fragment to set a column to null or non-null
as required by new_field, or None if no changes are required.
Nru   r   )r   r   )
rG   rJ   r   r   r   r   sql_alter_column_nullsql_alter_column_not_nullrr   r   )rM   r.   r6   r<   r  r[   s         r   r  /BaseDatabaseSchemaEditor._alter_column_null_sql  s     OO$$FF// %33t3OM >> **33  "ooi.>.>?)&1
  r!   c                    U R                  U5      nU R                  U5      nU/nU(       a  / nO8U R                  R                  R                  (       a  U R                  U5      n/ nUR                  U R                  S9nU(       a+  UR                  (       a  U R                  n	OU R                  n	OU R                  n	U	U R                  UR                  5      US   US.-  U4$ )z
Hook to specialize column default alteration.

Return a (sql, params) fragment to add or drop (depending on the drop
argument) a default to new_field's column.
ru   r   r   r   r  )r   r   rG   rJ   r   r   r   r    sql_alter_column_no_default_nullsql_alter_column_no_defaultsql_alter_column_defaultrr   r   )
rM   r.   r6   r<   r  r  r  r_   r  r[   s
             r   r  2BaseDatabaseSchemaEditor._alter_column_default_sql7  s     ,,Y7**95F__%%?? **;7GF!//4??/K~~;;66//C//)*:*:;%f-" 
 	
r!   c                     U(       a  U R                   nSn/ nOU R                  nU R                  U5      u  pgUR                  U R                  S9nUU R                  UR                  5      US   US.-  U4$ )z
Hook to specialize column database default alteration.

Return a (sql, params) fragment to add or drop (depending on the drop
argument) a default to new_field's column.
rb   ru   r   r  )r  r  r   r   rG   rr   r   )	rM   r.   r6   r<   r  r[   r   r_   r  s	            r   r  ;BaseDatabaseSchemaEditor._alter_column_database_default_sql]  s     22CKF//C"&"5"5i"@K!//4??/K//)*:*:;%f-& 
 	
r!   c                 <   / nU R                  XeUR                  R                  5      =n(       a  SU 3nOSnSn	U R                  R                  R
                  (       a  UR                  (       d}  UR                  UR                  :w  a7  U R                  XXCR                  5      u  pU
(       a  UR                  X45        UR                  (       a  U R                  UR                  5      n	U R                  U R                  UR                  5      UUU	S.-  / 4U4$ )a\  
Hook to specialize column type alteration for different backends,
for cases when a creation type is different to an alteration type
(e.g. SERIAL in PostgreSQL, PostGIS fields).

Return a 2-tuple of: an SQL fragment of (sql, params) to insert into
an ALTER TABLE statement and a list of extra (sql, params) tuples to
run once the field is altered.
rw   rb   )r   r   r   rv  )r   r)   r   rG   rJ   r  r   r   r  ri   r   sql_alter_column_typerr   r   )rM   r.   r6   r<   r  r  r  r  collate_sqlcomment_sqlr[   r_   s               r   r  /BaseDatabaseSchemaEditor._alter_column_type_sqly  s    ++%++*>*>
 
; 
 k]+KK??##55i>T>T##y';';; #<<h0D0D !((#7##"//	0D0DE **"ooi.>.>?$!,*	 	 
 	
r!   c                     U R                   U R                  UR                  R                  5      U R                  UR                  5      U R                  U5      S.-  / 4$ )N)r   r   rv  )sql_alter_column_commentrr   r)   r   r   r   )rM   r.   r<   r  new_db_comments        r   r  2BaseDatabaseSchemaEditor._alter_column_comment_sql  sZ    )))=)=>//)*:*:;,,^< 
 	
r!   c                 6    U R                  U=(       d    S5      $ )Nrb   r   )rM   rv  s     r   r   %BaseDatabaseSchemaEditor._comment_sql  s    2..r!   c                    UR                   R                  R                  R                  UR                   R                  R                  R                  :w  aw  U R	                  UR                   R                  UR                   R                  R                  R                  UR                   R                  R                  R                  5        U R                  UR                   R                  UR                   R                  R                  R                  UR                  5       5      UR                   R                  R                  R                  UR                  5       5      5        U R                  UR                   R                  UR                   R                  R                  R                  UR                  5       5      UR                   R                  R                  R                  UR                  5       5      5        g)z*Alter M2Ms to repoint their to= endpoints.N)	r?   r  r)   r   rs  r  r   m2m_reverse_field_namem2m_field_name)rM   r.   r6   r<   r  s        r   r  ,BaseDatabaseSchemaEditor._alter_many_to_many  s    ""**0099%%--33<<= &&..&&..44==&&..44== 	""** ""**00::002 ""**00::002	
 	""** ""**00::9;S;S;UV""**00::9;S;S;UV	
r!   rb   c                    [        U5      u  pA[        U/UQ7SS06< U< 3nU R                  R                  R	                  5       =(       d    SnU< SSR                  U5      < SU< 3n[        U5      U::  a  U$ [        U5      US-  :  a  USUS-   nU[        U5      -
  S-  S-
  nUSU < SSR                  U5      SU < SU< 3nUS	   S:X  d  US	   R                  5       (       a  S
USS -  nU$ )z
Generate a unique name for an index/unique constraint.

The name is divided into 3 parts: the table name, the column names,
and a unique digest and suffix.
length      r     N   rY  r   zD%s)r   r   rG   rq   max_name_lengthr   ra  isdigit)	rM   
table_namecolumn_namesrN  r  hash_suffix_part
max_lengthr  other_lengths	            r   r  +BaseDatabaseSchemaEditor._create_index_name  s    )4=l=1=
 __((88:Ac
#-sxx/EGWX
z?j( :>1/0A*/B"S)9%::q@1D}%HH\"=L1

 a=C:a=#8#8#:#:CR0Jr!   c                 t   Uc  [        U5      S:X  a$  US   R                  (       a  US   R                  nOW[        R                  (       a  [        R                  nO1UR                  R                  (       a  UR                  R                  nUb(  SU R
                  R                  R                  U5      -   $ g)NrY  r   rw   rb   )ra  r   r   DEFAULT_INDEX_TABLESPACEr)   rG   rq   r   )rM   r.   r   r   s       r   _get_index_tablespace_sql2BaseDatabaseSchemaEditor._get_index_tablespace_sql  s     6{aF1I$;$; &q	 7 722 ( A A** % 9 9$,,;;MJJJr!   c                     U(       a  SU-   $ g)Nz WHERE rb   r]   )rM   	conditions     r   _index_condition_sql-BaseDatabaseSchemaEditor._index_condition_sql  s    y((r!   c                     U(       a%  U R                   R                  R                  (       d  g[        S[	        UR
                  R                  X R                  5      S9$ )Nrb   z INCLUDE (%(columns)s))r   )rG   rJ   supports_covering_indexesr   r   r)   r   rr   )rM   r.   r   s      r   _index_include_sql+BaseDatabaseSchemaEditor._index_include_sql  sB    doo66PP$EKK00'??K
 	
r!   )r   r   rN  usingr   col_suffixesr[   	opclassesr"  includeexpressionsc                0  ^ ^ U=(       d    / nU=(       d    / n[        USS9R                  T R                  S9nT R                  XUS9nU Vs/ sH  oR                  PM     nnU=(       d    T R
                  nUR                  R                  nUU 4S jn[        U[        UT R                  5      [        UUUU5      UU(       a  T R                  UUXy5      O[        UXT R                  5      UT R                  U
5      T R!                  X5      S9$ s  snf )z
Return the SQL statement to create the index for one or several fields
or expressions. `sql` can be specified if the syntax differs from the
standard (GIS indexes, ...).
F
alias_colsru   )r   c                  P   > Tc  TR                   " U 0 UD6mTR                  T5      $ r2   )r  rr   )argskwargsr   rM   s     r   create_index_nameEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name0  s,    |..????4((r!   )r   r   r)  r   r`   r"  r,  )r   r   rG   r  r   sql_create_indexr)   r   r   r   rr   r
   _index_columnsr   rl   r#  r'  )rM   r.   r   r   rN  r)  r   r*  r[   r+  r"  r,  r-  r   r   r   r   r6  r   r4  s   `  `                r   rP  *BaseDatabaseSchemaEditor._create_index_sql  s   * 2!'R51>> ? 
 77 8 
 .44VE<<V47$"7"7$$	) t/5'63DE  ##E7LL t?O?OP //	:++E;
 	
 5s   Dc                    [        U=(       d    U R                  [        UR                  R                  U R
                  5      U R                  U5      S9nUR                  S   R                  nUR                  S   n[        U R                  5       HM  n[        U[         5      (       d  M  UR                  XV5      (       d  M2  U R                  R                  U5        MO     U$ )Nr   r   r   r   )r   rO  r   r)   r   rr   partsr   r$  rQ   r   references_indexr&  )rM   r.   r   r[   r   r  r  s          r   r  *BaseDatabaseSchemaEditor._delete_index_sqlE  s    (4((,,doo>&
	 __W-33
__V,
))*C#y))c.B.B/ / !!((-	 + r!   c                     [        U R                  [        UR                  R                  U R
                  5      U R                  U5      U R                  U5      S9$ )N)r   old_namenew_name)r   sql_rename_indexr   r)   r   rr   )rM   r.   r?  r@  s       r   r6  *BaseDatabaseSchemaEditor._rename_index_sqlW  sH    !!,,doo>__X.__X.	
 	
r!   c                 ,    [        XU R                  US9$ )N)r*  )r   rr   )rM   r   r   r*  r+  s        r   r7  'BaseDatabaseSchemaEditor._index_columns_  s    ut\RRr!   c                    UR                   R                  (       a6  UR                   R                  (       d  UR                   R                  (       a  / $ / nUR                   R                   H#  nUR                  U R                  X5      5        M%     UR                   R                   H[  nUR                  (       a'  U R                  R                  R                  (       d  M;  UR                  UR                  X5      5        M]     U$ )zb
Return a list of all index SQL statements (field indexes, Meta.indexes)
for the specified model.
)r)   managedproxyswappedr   r   r  r]  r*  rG   rJ   r+  ri   r   )rM   r.   outputr   r-  s        r   r  +BaseDatabaseSchemaEditor._model_indexes_sqlb  s    
 {{""ekk&7&75;;;N;NI[[--EMM$11%?@ . [[((E..??++GGGe..u;< ) r!   c                 t    / nU R                  X5      (       a  UR                  U R                  X/S95        U$ )zD
Return a list of all index SQL statements for the specified field.
r  )_field_should_be_indexedri   rP  )rM   r.   r   rI  s       r   r  +BaseDatabaseSchemaEditor._field_indexes_sqlu  s;     ((66MM$00w0GHr!   c                 N   UR                   (       d4  UR                  (       d#  UR                   (       d  UR                  (       d  gU=(       d
    [        5       nUR                  5       u  pEpgUR                  5       u  pHpUR	                  UR
                  5       H  nUR                  US 5        M     UR	                  UR
                  5       H  nU
R                  US 5        M     UR                  (       d  UR                  (       a  UR                  (       az  UR                  R                  R                  R                  UR                  R                  R                  R                  :X  a$  UR                  SS 5        U
R                  SS 5        UR                  S5      (       a\  U
R                  S5      (       aF  U R                  U5      U R                  U5      :X  a"  UR                  S5        U
R                  S5        UR                   (       aJ  UR                   (       a9  U R                  UR                  5      U R                  UR                  5      :w  a  gUR                  (       a,  UR                  (       a  UR                  UR                  :w  a  gXVU4XU
4:g  $ )NFtor   T)concreter   r  deconstructunionnon_db_attrspopr?   r.   r)   r   r   r   rr   r   r   )rM   r6   r<   r  r  old_pathold_args
old_kwargsnew_pathnew_args
new_kwargsattrs               r   r  1BaseDatabaseSchemaEditor._field_should_be_altered~  s   ##y'='=##y'='=35,5,A,A,C)X,5,A,A,C)X LL!7!78DNN4& 9LL!7!78DNN4& 9 &&&&&&&&,,22;;%%++11::; NN4&NN4& NN<((|,,##I.$2E2Ei2PPNN<(NN<(""!1!12dooiFVFV6WW""&&)..0J/H
3SSSr!   c                 J    UR                   =(       a    UR                  (       + $ r2   )r  r   rM   r.   r   s      r   rL  1BaseDatabaseSchemaEditor._field_should_be_indexed  s    ~~2ell"22r!   c                 J    UR                   (       + =(       a    UR                   $ r2   r   rM   r6   r<   s      r   r  2BaseDatabaseSchemaEditor._field_became_primary_key  s    (((BY-B-BBr!   c                     UR                   (       + =(       a7    UR                  =(       a$    UR                  (       + =(       d    UR                   $ r2   )r   r   rb  s      r   r  0BaseDatabaseSchemaEditor._unique_should_be_added  s?    %%% @  @%%%>)>)>	
r!   c                     U R                   U R                  U5      U R                  UR                  5      U R                  UR                  5      US.-  $ )N)r   
old_column
new_columnr   )sql_rename_columnrr   r   )rM   r   r6   r<   r  s        r   r  *BaseDatabaseSchemaEditor._rename_field_sql  sM    %%__U+//)*:*:;//)*:*:;	)
 
 	
r!   c           
         [        UR                  R                  U R                  5      nU R	                  XU5      n[        UR                  R                  UR                  /U R                  5      n[        UR                  R                  R                  R                  U R                  5      n[        UR                  R                  R                  R                  UR                  R                  /U R                  5      nU R                  R                  R                  5       n	[        U R                  UUUUUU	S9$ )N)r   r   r   rx   ry   r  )r   r)   r   rr   r  r   r   target_fieldr.   rG   rq   r  r   sql_create_fk)
rM   r.   r   rN  r   r   r   rx   ry   r  s
             r   r   'BaseDatabaseSchemaEditor._create_fk_sql  s    ekk**DOO<''f=--~tO++1177@@$//R$$**33&&'OO
	
 __((779
!
 	
r!   c                    ^  U 4S jn[        UR                  R                  UR                  /[	        UR
                  R                  R                  R                  5      S   UR
                  R                  /UU5      $ )Nc                  F   > TR                  TR                  " U 0 UD65      $ r2   rr   r  r2  r3  rM   s     r   create_fk_nameDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_name  s"    ??4#:#:D#KF#KLLr!   rY  )r	   r)   r   r   r   rl  r.   )rM   r.   r   rN  rs  s   `    r   r  ,BaseDatabaseSchemaEditor._fk_constraint_name  sk    	M KK  \\NU//55;;DDEaH&&'
 	
r!   c                 :    U R                  U R                  X5      $ r2   )rc  sql_delete_fkrM   r.   r   s      r   r  'BaseDatabaseSchemaEditor._delete_fk_sql      **4+=+=uKKr!   c                 `    Uc  gU[         R                  :X  a  gU[         R                  :X  a  gg )Nrb   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   DEFERRED	IMMEDIATE)rM   r  s     r   _deferrable_constraint_sql3BaseDatabaseSchemaEditor._deferrable_constraint_sql  s2    ,,,3---4 .r!   c                     USL a  gUSL a  gg)NFz NULLS NOT DISTINCTTz NULLS DISTINCTrb   r]   )rM   nulls_distincts     r    _unique_index_nulls_distinct_sql9BaseDatabaseSchemaEditor._unique_index_nulls_distinct_sql  s    U"(t#$r!   c                     U(       + =(       d     U R                   R                  R                  =(       a    U(       + =(       d     U R                   R                  R                  =(       a    U(       + =(       d     U R                   R                  R                  =(       a`    U(       + =(       d     U R                   R                  R
                  =(       a+    US L =(       d     U R                   R                  R                  $ r2   )rG   rJ   supports_partial_indexes&supports_deferrable_unique_constraintsr&  r+  *supports_nulls_distinct_unique_constraints)rM   r"  r  r,  r-  r  s         r   _unique_supported*BaseDatabaseSchemaEditor._unique_supported  s     ]Odoo66OO  S??++RR
 R 8 8 R R  W4??#;#;#W#W $& W??++VV	
r!   c
                    U R                  UUUUU	S9(       d  g U(       d  U(       d  U(       d
  U(       d  U	b9  U R                  UUUUUUUU	S9n
U
(       a  U R                  R                  U
5        g U R                  SR                  U Vs/ sH  oR                  UR                  5      PM     sn5      U R                  U5      S.-  nU R                  U R                  U5      US.-  $ s  snf )Nr"  r  r,  r-  r  )r   r"  r,  r+  r-  r  r   )r   r  r   r   )
r  r   rQ   ri   sql_unique_constraintr   rr   r   r~  sql_constraint)rM   r.   r   r   r"  r  r,  r+  r-  r  r[   r   r   s                r   _unique_sql$BaseDatabaseSchemaEditor._unique_sql  s    %%!#) & 
  ) ))##'- * 	C !!((-//yyV!TVE//%,,"?V!TU99*E3
 

 ""OOD)$&
 
 	
 "Us   #C+
c
                    U R                  UUUUU	S9(       d  g [        USS9R                  U R                  S9n
UR                  R
                  nU Vs/ sH  oR                  PM     nnUc  U R                  XSS9nOU R                  U5      nU(       d  U(       d  U(       d  U(       a  U R                  nOU R                  nU(       a  U R                  XSUS9nO[        XXR                  5      n[        U[        XR                  5      UUU R!                  U5      U R#                  U5      U R%                  X5      U R'                  U	5      S	9$ s  snf )
Nr  Fr/  ru   TrW  r]   )r*  r+  )r   r   r   r"  r  r,  r  )r  r   r   rG   r)   r   r   r`  rr   sql_create_unique_indexsql_create_uniquer7  r   rl   r   r   r#  r~  r'  r  )rM   r.   r   r   r"  r  r,  r+  r-  r  r   r   r   r   r[   s                  r   r   +BaseDatabaseSchemaEditor._create_unique_sqlD  sN    %%!#) & 
 51>> ? 
 $$-34VE<<V4<//d/KD??4(D9..C((C))R9 * G "%h@P@PQG///	:66zB++E;@@P	
 		
 5s   Ec                 R   ^  U(       a  U 4S jnOT R                   n[        XSU5      $ )Nc                  F   > TR                  TR                  " U 0 UD65      $ r2   rq  rr  s     r   create_unique_nameLBaseDatabaseSchemaEditor._unique_constraint_name.<locals>.create_unique_namez  s"    t'>'>'O'OPPr!   _uniq)r  r
   )rM   r   r   rX  r  s   `    r   r`  0BaseDatabaseSchemaEditor._unique_constraint_namew  s*    Q "&!8!82DEEr!   c	                     U R                  UUUUUS9(       d  g U(       d  U(       d  U(       d  U(       a  U R                  n	OU R                  n	U R                  XU5      $ )Nr  )r  rO  rE  rc  )
rM   r.   r   r"  r  r,  r+  r-  r  r[   s
             r   r  +BaseDatabaseSchemaEditor._delete_unique_sql  s]     %%!#) & 
 9''C((C**3t<<r!   c                 b    U R                   U R                  U5      U R                  SU0-  S.-  $ )Nrv   r  )r  rr   r   )rM   r   rv   s      r   
_check_sql#BaseDatabaseSchemaEditor._check_sql  s9    ""OOD)33w6FF&
 
 	
r!   c                     U R                   R                  R                  (       d  g [        U R                  [        UR                  R                  U R                  5      U R                  U5      US9$ )N)r   r   rv   )	rG   rJ    supports_table_check_constraintsr   sql_create_checkr   r)   r   rr   )rM   r.   r   rv   s       r   r  *BaseDatabaseSchemaEditor._create_check_sql  sU    ''HH!!,,doo>&	
 	
r!   c                     U R                   R                  R                  (       d  g U R                  U R                  X5      $ r2   )rG   rJ   r  rc  sql_delete_checkrx  s      r   r  *BaseDatabaseSchemaEditor._delete_check_sql  s1    ''HH**4+@+@%NNr!   c                     [        U[        UR                  R                  U R                  5      U R	                  U5      S9$ )Nr:  )r   r   r)   r   rr   )rM   templater.   r   s       r   rc  /BaseDatabaseSchemaEditor._delete_constraint_sql  s6    ,,doo>&
 	
r!   c
           
      z   Ub  U V
s/ sH  n
U R                   R                  R                  (       aP  U R                   R                  R	                  [        XR                   R                  R                  5       5      5      O$U R                   R                  R	                  U
5      PM     nn
U R                   R                  5        nU R                   R                  R                  XR                  R                  5      nSSS5        / nWR                  5        H  u  pUb
  X.S   :X  d  M  Ub  US   U:w  a  M   Ub  US   U:w  a  M.  Ub  US   U:w  a  M<  Ub  US   U:w  a  MJ  Ub  US   (       d  MY  Ub  US   U:w  a  Mg  U	(       a  X;  d  Mu  UR                  U
5        M     U$ s  sn
f ! , (       d  f       N= f)	z@Return all constraint names matching the columns and conditions.Nr   r   r   r-  rv   r  r   )rG   rJ   truncates_namesintrospectionidentifier_converterr   rq   r  rm   get_constraintsr)   r   itemsri   )rM   r.   r  r   r   r-  r  rv   r  rV  r   rm   r   resultinfodicts                  r   r^  *BaseDatabaseSchemaEditor._constraint_names  s    # )	 )D //?? OO11FF%dOO,?,?,O,O,QR 66KKDQ	R )  	 __##%//77GG,,K & )//1ND#|	7J'J%(8*<*F*x/F+/U$'):e)C$'):e)C*8M3J$&)9U)B$"5MM$' 2  ?	 &%s   B#F':F,,
F:c                 X   ^  T R                   SSR                  U 4S jU 5       5      0-  $ )Nr   r   c              3   D   >#    U H  nTR                  U5      v   M     g 7fr2   rr   )r4   r   rM   s     r   r7   >BaseDatabaseSchemaEditor._pk_constraint_sql.<locals>.<genexpr>  s      OwV!8!8wr   )sql_pk_constraintr   )rM   r   s   ` r   r   +BaseDatabaseSchemaEditor._pk_constraint_sql  s/    %%tyy Ow OO)
 
 	
r!   c                    U R                  USS9nU(       a?  [        U5      S:w  a0  [        S[        U5      < SUR                  R                  < 35      eU H#  nU R                  U R                  X5      5        M%     g )NTra  rY  rZ  z) of PK constraints for )r^  ra  rb  r)   r   rV   _delete_primary_key_sql)rM   r.   r  rg  r  s        r   r  ,BaseDatabaseSchemaEditor._delete_primary_key  su    11%T1Jc*+q0 ()KK((   0OLL55eMN  0r!   c                 `   [        U R                  [        UR                  R                  U R
                  5      U R                  U R                  UR                  R                  UR                  /SS95      [        UR                  R                  UR                  /U R
                  5      S9$ )N_pkr  )r   r   r   )	r   sql_create_pkr   r)   r   rr   r  r   r   r^  s      r   r  0BaseDatabaseSchemaEditor._create_primary_key_sql  s    ,,doo>''KK((5<<. ( 
 EKK005<<.$//R	
 		
r!   c                 :    U R                  U R                  X5      $ r2   )rc  sql_delete_pkrx  s      r   r  0BaseDatabaseSchemaEditor._delete_primary_key_sql  rz  r!   c                 <    U(       a  SU R                  U5      -   $ S$ )NzCOLLATE rb   r  )rM   r   r  r  s       r   r   %BaseDatabaseSchemaEditor._collate_sql  s    :CzDOOI66KKr!   c                     U R                   U R                  U5      SR                  U5      S.-  nU R                  U5        g )N,)	procedureparam_types)sql_delete_procedurerr   r   rV   )rM   procedure_namer  r[   s       r   remove_procedure)BaseDatabaseSchemaEditor.remove_procedure
  s=    ''888K0+
 
 	Sr!   )r   rL   rH   rI   rG   rQ   )FT)r]   )F)rb   r2   )NNNNN)NNNNNN)NNNNNNN)T)NNNNNNNNr   )z__name__
__module____qualname____firstlineno____doc__r   ro  r~  r#  r  r  r   r  r  r  r  r  r  ri  r  r  r   sql_delete_constraintr  r  r  r  r  rE  rm  r   r  rw  r6  r  rA  rO  r  r  r  rw  r  rN   rS   rW   rV   rr   r   r   r   r   r   r   r   r   r   staticmethodr  r   rl   r  r"  r.  r2  r9  r=  r@  rJ  rS  rD  rs  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r#  r'  rP  r  r6  r7  r  r  r  rL  r  r  r  r   r  r  r~  r  r  r  r   r`  r  r  r  r  rc  r^  r   r  r  r  r   r  __static_attributes__r]   r!   r   rD   rD   N   sc    AJV5T:PC FP"H'B$FN  	Q  A.L9N3X,	?  .	@   "&)M	9 
	B  I, 	R  *M9IVUA,>4aJA6F
6
)&S  2W$!>F.*	A4-+A*V* SDH&	
V$p.@Q
f	( q$f:$
N 16
8,
\	
/
B@


 4
l$
S&/Tb3C


*
L5 
: 2
p 1
f	F =2

O

 -^

O

LLr!   rD   )&loggingr+   r   	itertoolsr   django.confr   django.core.exceptionsr   !django.db.backends.ddl_referencesr   r   r	   r
   r   r   django.db.backends.utilsr   r   r   django.db.modelsr   r   !django.db.models.fields.compositer   django.db.models.sqlr   django.db.transactionr   r   django.utilsr   	getLoggerre   r    r/   r>   rD   r]   r!   r   <module>r     se          -  S R . A & D !			6	71 

.A Ar!   