
    jM                       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                  ;   =(       d    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attname)relationaltered_fieldr   s      V/var/www/html/KUNJ/venv/lib/python3.13/site-packages/django/db/backends/base/schema.py_is_relevant_relationr!      sb    
 NNE  U__%> 	eoo- 	4  EOO3    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_fieldsr0   -   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   N   >#    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   N   >#    U  H  n[        UT5      (       d  M  Uv   M     g 7fr3   r4   )r5   r6   	new_fields     r    r8   r9   C   r:   r;   )zipr0   r/   _related_non_m2m_objectsremote_field)r7   r=   related_fieldsold_relnew_rels   ``   r    r?   r?   :   s      	
*9??;	

	
*9??;	
N ++    
 	
 	
 +	
s   A6B:B;
Bc                   F   \ 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)SvS" jr*S# r+S$ r,SwS& jr-S' r.S( r/S) r0SxS* jr1S+ r2S, r3S- r4S. r5S/ r6S0 r7S1 r8\9S2 5       r:S3 r;S4 r<S5 r=S6 r>S7 r?S8 r@S9 rAS: rBS; rCS< rDS= rES> rFS? rGS@ rHSA rISB rJSC rKSxSD jrLSE rM SxSF jrNSG rOSxSH jrP SxSI jrQSJ rRSK rSSL rTSM rUSySO jrVSzSP jrWSQ rXSR rYSSSNSNSS%SS%SSSSS.ST jrZSzSU jr[SV r\SW r]SX r^SY r_SZ r`SzS[ jraS\ rbS] rcS^ rdS_ reS` rfSa rgSb rhSc riSd rj     S{Se jrk      S|Sf jrl       S}Sg jrmS~Sh jrn      S|Si jroSj rpSk rqSl rrSm rs        SSn jrtSo ruSxSp jrvSq rwSr rxSSs jrySwSt jrzSur{g)BaseDatabaseSchemaEditorQ   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)szALTER TABLE %(table)s ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) REFERENCES %(to_table)s (%(to_column)s)%(on_delete_db)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        0 U l        U R                   R                  R
                  =(       a    UU l        g r3   )
connectioncollect_sqlcollected_sqlcollected_table_renamesfeaturescan_rollback_ddlatomic_migration)selfrH   rI   r   s       r    __init__!BaseDatabaseSchemaEditor.__init__   sE    $&!#D ,.D( $ 8 8 I I Tfr"   c                     / U l         U R                  (       a>  [        U R                  R                  5      U l        U R                  R                  5         U $ r3   )deferred_sqlrN   r   rH   alias	__enter__)rO   s    r    rU   "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 r3   )rS   executerN   r   __exit__)rO   exc_type	exc_value	tracebacksqls        r    rY   !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)rI   rH   in_atomic_blockrL   rM   r   strloggerdebugrstripendswithrJ   appendtuplemapquote_valuecursorrX   )rO   r]   ra   endingro   s        r    rX    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      $ r3   )rH   ops
quote_name)rO   r   s     r    rt   #BaseDatabaseSchemaEditor.quote_name   s    ""--d33r"   c           
      X	  ^ ^ TR                   R                   HY  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        M[     / n/ nTR                   R                   GH  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a3  UR                  (       Ga!  UR                  R                  R                   R                   nUR                  R                  R                   R                  UR                  R"                  5      R$                  nT R&                  (       aH  UST R&                  T R)                  U5      T R)                  U5      T R+                  TU5      S.-  -   -  nOQT R                  R,                  R.                  (       a,  T R                  R	                  T R1                  TUS5      5        UR	                  T R)                  UR$                  5      < SU< 35        UR3                  5       S;   d  GM  T R                  R4                  R7                  TR                   R                   UR$                  5      nU(       d  GMi  T R                  R                  U5        GM     / nU(       aI  TR                   R8                   H.  nT R                  R	                  UR;                  TT 5      5        M0     O0UR                  UU 4S jTR                   R8                   5       5        TR                   R<                  n[?        U[@        5      (       a*  UR	                  T RC                  URD                  5      5        T RF                  T R)                  TR                   R                   5      S	RI                  S
 / UQUQ7 5       5      S.-  nTR                   RJ                  (       aH  T R                  R4                  RM                  TR                   RJ                  5      nU(       a  USU-   -  nUU4$ s  snf )z-Take a model and return its table definition.rH   check z %s)to_table	to_columnon_delete_db_fk_%(to_table)s_%(to_column)s)	AutoFieldBigAutoFieldSmallAutoFieldc              3   H   >#    U  H  nUR                  TT5      v   M     g 7fr3   )constraint_sql)r5   
constraintr/   rO   s     r    r8   5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>#  s(      #"9J ))%66"9   ", c              3   J   #    U  H  nU(       d  M  [        U5      v   M     g 7fr3   )rf   )r5   	statements     r    r8   r   .  s"      $!AI I!As   ##)table
definition)'r*   unique_together	get_fieldrS   rk   _create_unique_sqllocal_fields
column_sqldb_parametersrH   sql_check_constraintdb_type_suffixextendr@   db_constraintr/   db_table
field_namecolumnsql_create_inline_fkrt   _create_on_delete_sqlrL   supports_foreign_keys_create_fk_sqlget_internal_typers   autoinc_sqlconstraints
create_sqlpk
isinstancer   _pk_constraint_sqlcolumnssql_create_tablejoindb_tablespacetablespace_sql)rO   r/   field_namesr   fieldscolumn_sqlsra   r   extra_params	db_paramscol_type_suffixrz   r{   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%?(,(B(B5%(PE ) # J
 __--CC%%,,++!5*J  OOELL1 &&( - 
 #oo11==KK((%,, ;%%,,[9g .r  $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{{ 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_sqlrH   rL   requires_literal_defaultsprepare_defaultrk   empty_strings_allowedr   !interprets_empty_strings_as_nulls	generated_column_generated_sqlimplied_column_nulluniquer   r*   supports_tablespacesrs   r   supports_comments_inline
db_comment_comment_sql)rO   column_db_typera   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_sql>  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.
rw   typeNNry   )r   rH   r   r   )rO   r/   r   r   r   r   ra   s          r    r   #BaseDatabaseSchemaEditor.column_sql  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_   rO   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rO   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.   rw   c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr3   )r   r5   prO   s     r    r8   :BaseDatabaseSchemaEditor.db_default_sql.<locals>.<genexpr>  s      I&Q!5!5a!8!8&   !)django.db.models.expressionsr   _db_default_expressionr   r   r   r/   get_compilerrH   compilerL   r   rl   )	rO   r   r   
db_defaultr]   querycompilerr   ra   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                   (       a  S$ S$ )z=Return the SQL to define the persistency of generated fields.STOREDVIRTUAL)
db_persistr   s     r    !_column_generated_persistency_sql:BaseDatabaseSchemaEditor._column_generated_persistency_sql  s     ++x::r"   c                    ^  UR                  T R                  5      u  p#T R                  U5      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.c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr3   rn   r   s     r    r8   ABaseDatabaseSchemaEditor._column_generated_sql.<locals>.<genexpr>  s!     3XQWAD4D4DQ4G4GQWr   r_   zGENERATED ALWAYS AS (z) )r   rH   r   rL   r   rl   )rO   r   expression_sqlra   persistency_sqls   `    r    r   .BaseDatabaseSchemaEditor._column_generated_sql  sr    !&!4!4T__!E@@G??##==+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"   rd   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  rH   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    rn   $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`.
Nrw   r   )r   rX   rH   rL   supports_commentsr*   db_table_commentalter_db_table_commentr   r   r   r   _alter_column_comment_sqlrS   r   _model_indexes_sqllocal_many_to_manyr@   throughauto_createdcreate_model)rO   r/   r]   ra   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_modelrX   sql_delete_tablert   r   listrS   r   r   references_tableremove)rO   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ra   )contains_expressionsrH   rL   supports_expression_indexesrX   r   rO   r/   indexs      r    	add_index"BaseDatabaseSchemaEditor.add_index<  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)r2  rH   rL   r3  rX   
remove_sqlr4  s      r    remove_index%BaseDatabaseSchemaEditor.remove_indexG  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 )Nr1  )rH   rL   can_rename_indexrX   _rename_index_sqlr   r:  r6  )rO   r/   	old_index	new_indexs       r    rename_index%BaseDatabaseSchemaEditor.rename_indexP  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.Nr1  )r   rX   rO   r/   r   r]   s       r    add_constraint'BaseDatabaseSchemaEditor.add_constraintZ  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)r9  rX   rD  s       r    remove_constraint*BaseDatabaseSchemaEditor.remove_constraintb  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       HM  nU Vs/ s H  oR                  R                  U5      PM     nnU R                  U R                  X5      5        MO     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)rl   
difference_delete_composed_indexsql_delete_uniquer*   r   rX   r   )	rO   r/   old_unique_togethernew_unique_togetherr   oldsnewsr   r   s	            r    alter_unique_together.BaseDatabaseSchemaEditor.alter_unique_togetherh  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       HL  nU Vs/ s H  oR                  R                  U5      PM     nnU R                  U R                  XSS95        MN     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)r5  r   _idx)r   suffixN)rl   rK  rL  sql_delete_indexr*   r   rX   _create_index_sql)	rO   r/   old_index_togethernew_index_togetherr   rP  rQ  r   r   s	            r    alter_index_together-BaseDatabaseSchemaEditor.alter_index_together}  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           
        ^^ 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                  S5      SL n
UR                   R                  mU
(       a  [        U R                  5       H  m[        T[        5      (       d  M  TR                  T5      (       d  M2  [        UU4S jU	 5       5      (       d  MO  TR                  S   R                  U	:X  d  Mn  U R                  R!                  T5          g    U R"                  " UU	4SXg-  0UD6nU
(       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  [1        S	[/        U5      < S
UR                   R                  < SSR3                  U	5      < S35      eU R5                  U R7                  XAUS   5      5        g s  snf s  snf s  snf )Nr   Tc              3   H   >#    U  H  nTR                  TU5      v   M     g 7fr3   )references_column)r5   r   deferredr   s     r    r8   BBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<genexpr>  s%      PWf225&AAPWr   r   excludeFquote   Found wrong number (z) of constraints for (r   )r   )r*   r   r   indexesr   r   r   r   r,  rS   r   r   r-  allpartsr   r.  _constraint_namesrH   rL   *allows_multiple_constraints_on_same_fieldsrf   _unique_constraint_namelen
ValueErrorr   rX   _delete_constraint_sql)rO   r/   r   constraint_kwargsr]   r   meta_constraint_namesmeta_index_namesr   r   is_unique_constraintconstraint_namesdefault_namer`  r   s                @@r    rL  /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44X>$F$$ !2!23x33 11%88 PW   !y199WD%%,,X6 4  11
 *<
  	
 ! ((SS ,,U[[-A-A7RW,XL /$0>  A% ()KK((IIg&	  	T00=Ma=PQRg!
 SKs   I 
I%%.I*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                  (       a)  U R                  R                  X"5      nX@R                  U'   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)rH   rL   ignores_table_name_caselowerrX   sql_rename_tablert   rI   rK   poprS   r   r   rename_table_references)rO   r/   old_db_tablenew_db_tableexisting_tabler]   s         r    alter_db_table'BaseDatabaseSchemaEditor.alter_db_table  s    'OO$$<<""$(:(:(<<!!!__\:!__\:	
  "99==N :H((6$$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 )Nrd   )r   comment)	sql_alter_table_commentrH   rL   r  rX   rt   r*   r   rn   )rO   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)rX   sql_retablespace_tablert   r*   r   )rO   r/   old_db_tablespacenew_db_tablespaces       r    alter_db_tablespace,BaseDatabaseSchemaEditor.alter_db_tablespace  sQ    '')=)=>"&//2C"D"&//2C"D	
r"   c                 D	   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a  SnU R                  (       GaI  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       U R3                  X5      S
.-  -   -  nO+U R4                  R7                  U R9                  XU5      5        U R:                  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 RA                  U5      (       dl  U RC                  U5      bZ  U RE                  USUSS9u  pU RF                  U R-                  UR                  R                   5      US.-  nU R=                  X5        URH                  (       ax  U R                  R                  RJ                  (       aS  U R                  R                  RL                  (       d.  US   nU R<                  " U RO                  XXRH                  5      6   U R4                  RQ                  U RS                  X5      5        U R                  R                  RT                  (       a  U R                  RW                  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   Nrw   ry   rx   r}   z%s.rd   )r   	namespacer   rz   r{   
deferrabler|   )r   r   r   dropr   changesr   ),r   r@   r$  r*   r%  r&  r   r   rH   r   r   rL   r   r   sql_create_column_inline_fkr/   r   r   r   r   r   _fk_constraint_namert   rs   deferrable_sqlr   rS   rk   r   sql_create_columnrX   r   r   r   _alter_column_default_sqlsql_alter_columnr   r  r   r!  r   _field_indexes_sqlconnection_persists_old_columnsclose)rO   r/   r   r   ra   r   r   constraint_suffixrz   r{   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$($>$>u$L
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.
rw   r   NTforeign_key)r   r   )r   r@   r$  r*   r%  r*  r   rH   rl  r   rX   _delete_fk_sqlsql_delete_columnrt   r   rL   r  r  r,  rS   r   r   r_  r.  )rO   r/   r   fk_namesfk_namer]   s         r    remove_field%BaseDatabaseSchemaEditor.remove_fieldQ  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	OUR                  (       ap   UR                  U R                  5      n
UR                  U R                  5      nX:g  n	U R                  R                  nU	(       d  Xh:w  a  UR                  (       d  S	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.
Nrw   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   rH   r@   rp  r$  r*   r%  _alter_many_to_manyr   r   r   rL   )supports_alter_generated_column_data_typer   _alter_field)rO   r/   r7   r=   strictold_db_paramsold_typenew_db_paramsnew_typemodifying_generated_fieldold_field_sqlnew_field_sqldb_featuress                r    alter_field$BaseDatabaseSchemaEditor.alter_fieldq  s    ,,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(,%  5 ) 7 7 H
 !* 7 7 H,9,J)"oo66 2 ,'QQ04-$I) UH H 
 			
+  1,0)1s   K# #K21K2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   )rH   data_type_check_constraintsdb_type_parametersr   KeyError)rO   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  re  rf  z!) of foreign key constraints for .F)r   r   rb  z) of unique constraints for r   )r5  type_rb  )rx   rb  z) of check constraints for rw   r  Nr   r  r   )r   r   r  r   r   r   r}   _fk_checkrV  rx   )IsetrH   rL   r   r@   r   r  rl  r   ro  rp  r*   r   addrX   r  r   _field_became_primary_keyr   r   _delete_unique_sqlr   r   r?   related_modelr   db_indexri  r   rV  _delete_index_sqlr  _delete_check_sql_rename_field_sqlrS   r   r   rename_column_referencesr   r  r   _alter_column_type_sqlrk   r   r   r   "_alter_column_database_default_sqlr   r   r   r  _alter_column_null_sqlr  supports_combined_altersrl   r>   r   r   r  rt   r   sql_update_with_default_delete_primary_key_unique_should_be_addedr   rX  _create_primary_key_sqlr   r   _create_index_name_create_check_sqlr  r  )4rO   r/   r7   r=   r  r  r  r  r  fks_droppedr  r  r   rs  rv  constraint_nameold_collationnew_collationdrop_foreign_keys_old_relrC   rel_fk_namesr5  rt  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_alterationra   r   rels_to_updaterB   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.
Nrw   r   )r   r   )
rH   rL   r   r   r   r   sql_alter_column_nullsql_alter_column_not_nullrt   r   )rO   r/   r7   r=   r  r]   s         r    r  /BaseDatabaseSchemaEditor._alter_column_null_sqlK  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.
rw   r   r   r   r  )r   r   rH   rL   r   r   r   r    sql_alter_column_no_default_nullsql_alter_column_no_defaultsql_alter_column_defaultrt   r   )
rO   r/   r7   r=   r  r  r  ra   r  r]   s
             r    r  2BaseDatabaseSchemaEditor._alter_column_default_sqlh  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.
rd   rw   r   r
  )r  r  r   r   rH   rt   r   )	rO   r/   r7   r=   r  r]   r   ra   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.
ry   rd   )r   r   r   r  )r   r*   r   rH   rL   r  r   r   r!  rk   r   sql_alter_column_typert   r   )rO   r/   r7   r=   r  r  r  r  collate_sqlcomment_sqlr]   ra   s               r    r  /BaseDatabaseSchemaEditor._alter_column_type_sql  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   r  )sql_alter_column_commentrt   r*   r   r   r   )rO   r/   r=   r  new_db_comments        r    r!  2BaseDatabaseSchemaEditor._alter_column_comment_sql  sZ    )))=)=>//)*:*:;,,^< 
 	
r"   c                 6    U R                  U=(       d    S5      $ Nrd   r  )rO   r  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   r  r  r   m2m_reverse_field_namem2m_field_name)rO   r/   r7   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"   rd   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   re  r   zD%s)r   r   rH   rs   max_name_lengthr   ro  isdigit)	rO   
table_namecolumn_namesrV  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)Nre  r   ry   rd   )ro  r   r   DEFAULT_INDEX_TABLESPACEr*   rH   rs   r   )rO   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 rd   r_   )rO   	conditions     r    _index_condition_sql-BaseDatabaseSchemaEditor._index_condition_sql3  s    y((r"   c                     U(       a%  U R                   R                  R                  (       d  g[        S[	        UR
                  R                  X R                  5      S9$ )Nrd   z INCLUDE (%(columns)s))r   )rH   rL   supports_covering_indexesr   r   r*   r   rt   )rO   r/   r   s      r    _index_include_sql+BaseDatabaseSchemaEditor._index_include_sql8  sB    doo66PP$EKK00'??K
 	
r"   )r   r   rV  usingr   col_suffixesr]   	opclassesr5  includeexpressionsc                2  ^ ^ 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_colsrw   )r   c                  P   > Tc  TR                   " U 0 UD6mTR                  T5      $ r3   )r  rt   )argskwargsr   rO   s     r    create_index_nameEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_namea  s,    |..????4((r"   )r   r   r<  r   rb   r5  r?  )r   r   rH   r2  r   sql_create_indexr*   r   r   r   rt   r
   _index_columnsr   rn   r6  r:  )rO   r/   r   r   rV  r<  r   r=  r]   r>  r5  r?  r@  r   r   r   r   rI  r   rG  s   `  `                r    rX  *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   rW  r   r*   r   rt   rk  r   r,  rS   r   references_indexr.  )rO   r/   r   r]   r   r*  r  s          r    r  *BaseDatabaseSchemaEditor._delete_index_sqlv  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   rt   )rO   r/   rQ  rR  s       r    r>  *BaseDatabaseSchemaEditor._rename_index_sql  sH    !!,,doo>__X.__X.	
 	
r"   c                 r    UR                   n UR                  R                  U 5      $ ! [         a     gf = fr  )r@   	on_deleteon_delete_sqlAttributeError)rO   r/   r   r@   s       r    r   .BaseDatabaseSchemaEditor._create_on_delete_sql  s;    ))	))77== 		s   ) 
66c                 ,    [        XU R                  US9$ )N)r=  )r   rt   )rO   r   r   r=  r>  s        r    rJ  '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  ri  r2  rH   rL   r3  rk   r   )rO   r/   outputr   r5  s        r    r"  +BaseDatabaseSchemaEditor._model_indexes_sql  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_indexedrk   rX  )rO   r/   r   r`  s       r    r  +BaseDatabaseSchemaEditor._field_indexes_sql  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_attrsr  r@   r/   r*   r   r   r   rt   r   r   )rO   r7   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                  (       + $ r3   )r  r   rO   r/   r   s      r    rc  1BaseDatabaseSchemaEditor._field_should_be_indexed  s    ~~2ell"22r"   c                 J    UR                   (       + =(       a    UR                   $ r3   r   rO   r7   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                   $ r3   )r   r   rx  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_columnrt   r   )rO   r   r7   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	U R                  X5      S9$ )N)r   r   r   rz   r{   r  r|   )r   r*   r   rt   r  r   r   target_fieldr/   rH   rs   r  r   sql_create_fkr   )
rO   r/   r   rV  r   r   r   rz   r{   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
!33EA	
 		
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      $ r3   rt   r  rE  rF  rO   s     r    create_fk_nameDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_name  s"    ??4#:#:D#KF#KLLr"   re  )r	   r*   r   r   r   r  r/   )rO   r/   r   rV  r  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      $ r3   )rq  sql_delete_fkrO   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 )Nrd   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   DEFERRED	IMMEDIATE)rO   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 DISTINCTrd   r_   )rO   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                  $ r3   )rH   rL   supports_partial_indexes&supports_deferrable_unique_constraintsr9  r3  *supports_nulls_distinct_unique_constraints)rO   r5  r  r?  r@  r  s         r    _unique_supported*BaseDatabaseSchemaEditor._unique_supported1  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r5  r  r?  r@  r  )r   r5  r?  r>  r@  r  r   )r   r  r   r   )
r  r   rS   rk   sql_unique_constraintr   rt   r   r  sql_constraint)rO   r/   r   r   r5  r  r?  r>  r@  r  r]   r   r   s                r    _unique_sql$BaseDatabaseSchemaEditor._unique_sqlI  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  FrB  rw   Trc  r_   )r=  r>  )r   r   r   r5  r  r?  r  )r  r   r   rH   r*   r   r   rn  rt   sql_create_unique_indexsql_create_uniquerJ  r   rn   r   r   r6  r  r:  r  )rO   r/   r   r   r5  r  r?  r>  r@  r  r   r   r   r   r]   s                  r    r   +BaseDatabaseSchemaEditor._create_unique_sql}  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      $ r3   r  r  s     r    create_unique_nameLBaseDatabaseSchemaEditor._unique_constraint_name.<locals>.create_unique_name  s"    t'>'>'O'OPPr"   _uniq)r  r
   )rO   r   r   rd  r  s   `    r    rn  0BaseDatabaseSchemaEditor._unique_constraint_name  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  rW  rM  rq  )
rO   r/   r   r5  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.-  $ )Nrx   r  )r  rt   r   )rO   r   rx   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   rx   )	rH   rL    supports_table_check_constraintsr   sql_create_checkr   r*   r   rt   )rO   r/   r   rx   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      $ r3   )rH   rL   r  rq  sql_delete_checkr  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$ )NrM  )r   r   r*   r   rt   )rO   templater/   r   s       r    rq  /BaseDatabaseSchemaEditor._delete_constraint_sql  s6    ,,doo>&
 	
r"   c
           
         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                  nU R                  (       a  U R                  R                  X5      nU R                   R                  5        nU R                   R                  R                  X5      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   r5  rx   r  r   )rH   rL   truncates_namesintrospectionidentifier_converterr   rs   r(  r*   r   rI   rK   r   ro   get_constraintsitemsrk   )rO   r/   r+  r   r   r5  r  rx   r  rb  r   r*  ro   r   resultinfodicts                   r    rl  *BaseDatabaseSchemaEditor._constraint_names  s    # )	 )D //?? OO11FF%dOO,?,?,O,O,QR 66KKDQ	R )  	 [[))
5599*QJ__##%//77GGK & )//1ND#|	7J'J%(8*<*F*x/F+/U$'):e)C$'):e)C*8M3J$&)9U)B$"5MM$' 2  E	 &%s   B$G
&G
G)c                 X   ^  T R                   SSR                  U 4S jU 5       5      0-  $ )Nr   r   c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr3   rt   )r5   r   rO   s     r    r8   >BaseDatabaseSchemaEditor._pk_constraint_sql.<locals>.<genexpr>$  s      OwV!8!8wr   )sql_pk_constraintr   )rO   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 )NTrw  re  rf  z) of PK constraints for )rl  ro  rp  r*   r   rX   _delete_primary_key_sql)rO   r/   r  rv  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   rt   r  r   r   rt  s      r    r  0BaseDatabaseSchemaEditor._create_primary_key_sql4  s    ,,doo>''KK((5<<. ( 
 EKK005<<.$//R	
 		
r"   c                 :    U R                  U R                  X5      $ r3   )rq  sql_delete_pkr  s      r    r  0BaseDatabaseSchemaEditor._delete_primary_key_sql@  r  r"   c                 <    U(       a  SU R                  U5      -   $ S$ )NzCOLLATE rd   r  )rO   r   r  r*  s       r    r   %BaseDatabaseSchemaEditor._collate_sqlC  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_procedurert   r   rX   )rO   procedure_namer  r]   s       r    remove_procedure)BaseDatabaseSchemaEditor.remove_procedureF  s=    ''888K0+
 
 	Sr"   )r   rN   rI   rJ   rK   rH   rS   )FT)r_   )F)rd   r3   )NNNNN)NNNNNN)NNNNNNN)T)NNNNNNNNr   )|__name__
__module____qualname____firstlineno____doc__r   r~  r  r+  r  r  r  r  r  r  r  r  r  r  r  r  r   sql_delete_constraintr  r  r  r  r  rM  r  r   r  r  rI  r  rS  rW  r  r  r  r  r  rP   rU   rY   rX   rt   r   r   r   r   r   r   r   r   r   r   staticmethodr  r   rn   r&  r*  r6  r:  rA  rE  rH  rR  r[  rL  r  r   r  r  r  r  r  r  r  r  r  r  r!  r   r  r  r2  r6  r:  rX  r  r>  r   rJ  r"  r  r  rc  r  r  r  r   r  r  r  r  r  r  r   rn  r  r  r  r  rq  rl  r   r  r  r  r   r  __static_attributes__r_   r"   r    rE   rE   Q   sm    AJV5T:PC FP"H'B$FN  	Q  A.L9N3X,	?  .	P   "&)M	9 
	B  I, 	R  *M9IVUA,>4bLA6F
6
)&;S  2W$!>F.*	A4-+A*V*4SlH6	
W$r.@Z
x	( q$f:$
N 16
8,
\	
/
B@


 4
l$
S&/Tb3C


,
L5 
: 2
p 1
f	F =2

O

 0d

O

LLr"   rE   )&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   	getLoggerrg   r!   r0   r?   rE   r_   r"   r    <module>r     se          -  S R . A & D !			6	7&

.z zr"   