
    h                         d dl Z d dlmZ d dlmZmZmZmZmZ d dlm	Z	m
Z
 d dlmZmZ d dlmZmZ d dlmZ  e j&                  d      Zd	 Zd
 Zd Z G d d      Zy)    N)datetime)ColumnsForeignKeyName	IndexName	StatementTable)names_digestsplit_identifier)
DeferrableIndex)TransactionManagementErroratomic)timezonezdjango.db.backends.schemac                     | j                   }|j                  ry|j                  r|j                  dgk(  ry|j                  |j                  v S )zz
    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      a/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/django/db/backends/base/schema.py_is_relevant_relationr      sG    
 NNE  U__%>00    c                 >    | j                   j                  ddd      S )NFT)forwardreverseinclude_hidden)_meta_get_fields)models    r   _all_related_fieldsr"      s    ;;""5$t"TTr   c                      t         fdt         j                        D        fdt        j                        D              S )Nc              3   <   K   | ]  }t        |      s|  y wNr   ).0obj	old_fields     r   	<genexpr>z+_related_non_m2m_objects.<locals>.<genexpr>'        f@UVY[d@ef   c              3   <   K   | ]  }t        |      s|  y wr%   r&   )r'   r(   	new_fields     r   r*   z+_related_non_m2m_objects.<locals>.<genexpr>(   r+   r,   )zipr"   r!   )r)   r.   s   ``r   _related_non_m2m_objectsr0   #   s6     f+IOO<ff+IOO<f r   c            	       <   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZeZdZeZdZdZdZeZdZdZdZ dZ!eZ"dZ#d\dZ$d Z%d Z&d]d!Z'd" Z(d# Z)d^d$Z*d% Z+d& Z,d' Z-e.d(        Z/d) Z0d* Z1d+ Z2d, Z3d- Z4d. Z5d/ Z6d0 Z7d1 Z8d2 Z9d3 Z:d4 Z;d5 Z<d6 Z=d7 Z>d^d8Z?	 d^d9Z@d: ZAd^d;ZBd< ZCd= ZDd_d?ZEd`d@ZFdA ZGdd>d>dd dd ddBdCZHd`dDZIdE ZJdF ZKdG ZLdH ZMdI ZNdJ ZOdK ZPdL ZQdM ZRdN ZSdO ZTdadPZUdbdQZVdadRZWdS ZXdT ZYdU ZZdV Z[	 	 	 dcdWZ\d^dXZ]dY Z^dZ Z_d]d[Z`y)dBaseDatabaseSchemaEditorz
    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)sz%ALTER COLUMN %(column)s TYPE %(type)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 DEFAULTz4ALTER TABLE %(table)s DROP COLUMN %(column)s CASCADEzDALTER 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?ALTER TABLE %(table)s ADD CONSTRAINT %(name)s CHECK (%(check)s)zPALTER TABLE %(table)s ADD CONSTRAINT %(name)s UNIQUE (%(columns)s)%(deferrable)sz|ALTER TABLE %(table)s ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) REFERENCES %(to_table)s (%(to_column)s)%(deferrable)sNzFCREATE INDEX %(name)s ON %(table)s (%(columns)s)%(extra)s%(condition)szDCREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)%(condition)szDROP INDEX %(name)szGALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)zDROP PROCEDURE %(procedure)sc                     || _         || _        | j                  rg | _        | j                   j                  j                  xr || _        y r%   )
connectioncollect_sqlcollected_sqlfeaturescan_rollback_ddlatomic_migration)selfr4   r5   r   s       r   __init__z!BaseDatabaseSchemaEditor.__init__`   s?    $&!#D $ 8 8 I I Tfr   c                     g | _         | j                  r>t        | j                  j                        | _        | j                  j                          | S r%   )deferred_sqlr9   r   r4   alias	__enter__)r:   s    r   r?   z"BaseDatabaseSchemaEditor.__enter__i   s>       !6!67DKKK!!#r   c                     |"| j                   D ]  }| j                  |        | j                  r| j                  j	                  |||       y y r%   )r=   executer9   r   __exit__)r:   exc_type	exc_value	tracebacksqls        r   rB   z!BaseDatabaseSchemaEditor.__exit__p   sM    (( "S!"  KK  9i@ !r    c           	      p   | j                   sA| j                  j                  r+| j                  j                  j                  st        d      t        |      }t        j                  d||||d       | j                   ru|j                  d      rdnd}|?| j                  j                  |t        t        | j                  |            z  |z          y| j                  j                  ||z          y| j                  j                         5 }|j!                  ||       ddd       y# 1 sw Y   yxY w)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))paramsrF   )extra; N)r5   r4   in_atomic_blockr7   r8   r   strloggerdebugendswithr6   appendtuplemapquote_valuecursorrA   )r:   rF   rI   endingrV   s        r   rA   z BaseDatabaseSchemaEditor.executey   s    DOO$C$CDOOLdLdLuLu,? 
 #h&VfUX;YZ<<,R#F!""))3s4;K;KV7T1U+UY_*_`""))#,7'') ,VsF+, , ,s   D,,D5c                 L    | j                   j                  j                  |      S r%   )r4   ops
quote_name)r:   r   s     r   rZ   z#BaseDatabaseSchemaEditor.quote_name   s    ""--d33r   c                    |j                   j                  D ]_  }|D cg c]'  }|j                   j                  |      j                  ) }}| j                  j                  | j                  ||             a g }g }|j                   j                  D ]N  }| j                  ||      \  }}||j                  | j                        }	|	d   r|d| j                  |	z  z   z  }|j                  | j                        }
|
r|d|
z  z  }|j                  |       |j                  r|j                  r|j                  j                   j                   j"                  }|j                  j                   j                   j                  |j                  j$                        j                  }| j&                  r7|d| j&                  | j)                  |      | j)                  |      dz  z   z  }nL| j                  j*                  j,                  r,| j                  j                  | j/                  ||d             |j                  | j)                  |j                        d|       |j1                         dv s| j                  j2                  j5                  |j                   j"                  |j                        }|s4| j                  j                  |       Q |j                   j6                  D cg c]  }|j9                  ||        }}| j:                  | j)                  |j                   j"                        dj=                  d	 g ||D              d
z  }|j                   j>                  rC| j                  j2                  jA                  |j                   j>                        }|r|d|z   z  }||fS c c}w c c}w )z-Take a model and return its table definition.r4   check  %s)to_table	to_column_fk_%(to_table)s_%(to_column)s)	AutoFieldBigAutoFieldSmallAutoField, c              3   &   K   | ]	  }|s|  y wr%   rG   )r'   
constraints     r   r*   z5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>   s     #l:akJ#ls   )table
definition)!r   unique_together	get_fieldcolumnr=   rR   _create_unique_sqllocal_fields
column_sqldb_parametersr4   sql_check_constraintdb_type_suffixextendremote_fielddb_constraintr!   db_table
field_namesql_create_inline_fkrZ   r7   supports_foreign_keys_create_fk_sqlget_internal_typerY   autoinc_sqlconstraintsconstraint_sqlsql_create_tablejoindb_tablespacetablespace_sql)r:   r!   fieldsr   columnscolumn_sqlsrI   rj   extra_params	db_paramscol_type_suffixr`   ra   r}   rh   r~   rF   r   s                     r   	table_sqlz"BaseDatabaseSchemaEditor.table_sql   sO    kk11 	NFHNOuu{{,,U3::OGO$$T%<%<UG%LM	N [[-- #	:E'+ue'D$J!++t+GI!cD$=$=	$III
#22doo2NOeo55
MM,'!!e&9&9 --3399BB!..44::DDUEWEWEbEbcjj	,,#(A(A$(OOH$=%)__Y%?E ) # J __--CC%%,,T-@-@Oo-pq-   &&(,[["oo11==ekk>R>RTYT`T`a%%,,[9G#	:H QVP[P[PgPgh*z00=hh##__U[[%9%9:))#lA];A]Q\A]#ll'
 
 ;;$$!__00??@Y@YZNs^++F{e PR is   ,O=O
c                    |j                  | j                        }|d   }g }|y|j                  }|xr | j                  |       }|rj| j	                  |      }d| j                  |      z   }	|C| j                  j                  j                  r||	| j                  |      z  z  }n||	z  }||gz  }|j                  r.|j                  s"| j                  j                  j                  rd}|r&| j                  j                  j                  s|dz  }n|s|dz  }|j                  r|dz  }n|j                  r|d	z  }|j                  xs |j                  j                  }
|
rY| j                  j                  j                   r9|j                  r-|d
| j                  j"                  j%                  |
d      z  z  }||fS )z
        Take a field and return its column definition.
        The field must already have had set_attributes_from_name() called.
        r\   typeNNz	 DEFAULT Tz NULLz	 NOT NULLz PRIMARY KEYz UNIQUEr_   )inline)rq   r4   nullskip_defaulteffective_default_column_default_sqlr7   requires_literal_defaultsprepare_defaultempty_strings_allowedr   !interprets_empty_strings_as_nullsimplied_column_nulluniquer   r   supports_tablespacesrY   r   )r:   r!   r   include_defaultr   rF   rI   r   default_valuecolumn_default
tablespaces              r   rp   z#BaseDatabaseSchemaEditor.column_sql   s    ''4??'C	;zz)J$2C2CE2J.J 2259M(4+C+CE+JJN(??++EE >D,@,@,OOOC>)C}o-F ''0A0A((JJD00DD7NC;C>!C\\9C((EEKK,E,E
$//22GGELL54??..==jQU=VVVCF{r   c                      y)z
        Some backends don't accept default values for certain columns types
        (i.e. MySQL longtext and longblob).
        FrG   r:   r   s     r   r   z%BaseDatabaseSchemaEditor.skip_default   s    
 r   c                     t        d      )zU
        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r:   values     r   r   z(BaseDatabaseSchemaEditor.prepare_default  s     "P
 	
r   c                      y)z
        Return the SQL to use in a DEFAULT clause. The resulting string should
        contain a '%s' placeholder for a default value.
        %srG   r   s     r   r   z,BaseDatabaseSchemaEditor._column_default_sql  s    
 r   c                    | j                         r| j                         }|S | j                  s3| j                  r'| j                  r| j                         dk(  rd}|S d}|S t        | dd      st        | dd      rmt        j                         }| j                         }|dk(  r|j                         }|S |dk(  r|j                         }|S |d	k(  rt        j                         }|S d }|S )
NBinaryFieldr   rL   auto_nowFauto_now_add	DateField	TimeFieldDateTimeField)has_defaultget_defaultr   blankr   r|   getattrr   nowdatetimer   )r   defaultinternal_types      r   _effective_defaultz+BaseDatabaseSchemaEditor._effective_default  s     '')G" ! 0K0K&&(M9    UJ.'%QV2WllnG!335M+!,,.  +-!,,.
 	 /1",,.  Gr   c                 X    |j                  | j                  |      | j                        S )z2Return a field's effective database default value.)get_db_prep_saver   r4   r   s     r   r   z*BaseDatabaseSchemaEditor.effective_default-  s$    %%d&=&=e&DdooVVr   c                     t               )aX  
        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   rU   z$BaseDatabaseSchemaEditor.quote_value1  s     "##r   c                    | j                  |      \  }}| j                  ||xs d       | j                  j                  | j	                  |             |j
                  j                  D ]R  }|j                  j                  j
                  j                  s.| j                  |j                  j                         T y)zr
        Create a table and any accompanying indexes or unique constraints for
        the given `model`.
        N)r   rA   r=   rt   _model_indexes_sqlr   local_many_to_manyru   throughauto_createdcreate_model)r:   r!   rF   rI   r   s        r   r   z%BaseDatabaseSchemaEditor.create_model=  s    
 nnU+VS&.D) 	  !8!8!?@ [[33 	>E!!))//<<!!%"4"4"<"<=	>r   c                 8   |j                   j                  D ]R  }|j                  j                  j                   j                  s.| j                  |j                  j                         T | j                  | j                  d| j                  |j                   j                        iz         t        | j                        D ]T  }t        |t              s|j                  |j                   j                        s:| j                  j                  |       V y)z!Delete a model from the database.ri   N)r   r   ru   r   r   delete_modelrA   sql_delete_tablerZ   rw   listr=   
isinstancer   references_tableremove)r:   r!   r   rF   s       r   r   z%BaseDatabaseSchemaEditor.delete_modelN  s     [[33 	>E!!))//<<!!%"4"4"<"<=	>
 	T**T__U[[%9%9:.
 
 	 ))* 	.C#y)c.B.B5;;CWCW.X!!((-	.r   c                 J    | j                  |j                  ||       d       y)zAdd an index on a model.N)rI   )rA   
create_sqlr:   r!   indexs      r   	add_indexz"BaseDatabaseSchemaEditor.add_index^  s    U%%eT24@r   c                 F    | j                  |j                  ||              y)zRemove an index from a model.N)rA   
remove_sqlr   s      r   remove_indexz%BaseDatabaseSchemaEditor.remove_indexb  s    U%%eT23r   c                 P    |j                  ||       }|r| j                  |       yy)zAdd a constraint to a model.N)r   rA   r:   r!   rh   rF   s       r   add_constraintz'BaseDatabaseSchemaEditor.add_constraintf  (    ##E40LL r   c                 P    |j                  ||       }|r| j                  |       yy)z!Remove a constraint from a model.N)r   rA   r   s       r   remove_constraintz*BaseDatabaseSchemaEditor.remove_constraintl  r   r   c                    |D ch c]  }t        |       }}|D ch c]  }t        |       }}|j                  |      D ]"  }| j                  ||ddi| j                         $ |j                  |      D ]U  }|D cg c]'  }|j                  j                  |      j                  ) }}| j                  | j                  ||             W yc c}w c c}w c c}w )z
        Deal with a model changing its unique_together. The input
        unique_togethers must be doubly-nested, not the single-nested
        ["foo", "bar"] format.
        r   TN)	rS   
difference_delete_composed_indexsql_delete_uniquer   rl   rm   rA   rn   )	r:   r!   old_unique_togethernew_unique_togetherr   oldsnewsr   r   s	            r   alter_unique_togetherz.BaseDatabaseSchemaEditor.alter_unique_togetherr  s     -@@&f@@,?@&f@@ood+ 	aF''v$7GI_I_`	a ood+ 	BFHNOuu{{,,U3::OGOLL00@A	B A@ Ps   CC?,Cc                    |D ch c]  }t        |       }}|D ch c]  }t        |       }}|j                  |      D ]#  }| j                  ||ddd| j                         % |j                  |      D ]M  }|D cg c]  }|j                  j                  |       }}| j                  | j                  ||d             O yc c}w c c}w c c}w )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suffixN)rS   r   r   sql_delete_indexr   rl   rA   _create_index_sql)	r:   r!   old_index_togethernew_index_togetherr   r   r   field_namesr   s	            r   alter_index_togetherz-BaseDatabaseSchemaEditor.alter_index_together  s     -??&f??,>?&f??ood+ 	F''%0%%		  ??40 	OK@KLuekk++E2LFLLL//vf/MN	O @? Ms   C
C "Cc           
      T   |j                   j                  D ch c]  }|j                   }}|j                   j                  D ch c]  }|j                   }}|D cg c]'  }|j                   j	                  |      j
                  ) }	} | j                  ||	fd||z  i|}
t        |
      dk7  rAt        dt        |
      d|j                   j                  ddj                  |	      d      | j                  | j                  |||
d                y c c}w c c}w c c}w )	Nexclude   Found wrong number (z) of constraints for (rf   )r   )r   r~   r   indexesrl   rm   _constraint_nameslen
ValueErrorrw   r   rA   _delete_constraint_sql)r:   r!   r   constraint_kwargsrF   rh   meta_constraint_namesmeta_index_namesr   r   constraint_namess              r   r   z/BaseDatabaseSchemaEditor._delete_composed_index  s   CH;;CZCZ [Z [ [>Ckk>Q>QR
JOORRDJK55;;((/66KK14117
$9<L$L

  A%$%$$		'"  
 	T00e=Ma=PQR !\RKs   DD ,D%c                 x   ||k(  sA| j                   j                  j                  r"|j                         |j                         k(  ry| j	                  | j
                  | j                  |      | j                  |      dz         | j                  D ]%  }t        |t              s|j                  ||       ' y)z#Rename the table a model points to.N)	old_table	new_table)r4   r7   ignores_table_name_caselowerrA   sql_rename_tablerZ   r=   r   r   rename_table_references)r:   r!   old_db_tablenew_db_tablerF   s        r   alter_db_tablez'BaseDatabaseSchemaEditor.alter_db_table  s    L(__%%==""$(:(:(<<T**66.
 
 	
 $$ 	HC#y)++L,G	Hr   c                     | j                  | j                  | j                  |j                  j                        | j                  |      | j                  |      dz         y)z)Move a model's table between tablespaces.)ri   old_tablespacenew_tablespaceN)rA   sql_retablespace_tablerZ   r   rw   )r:   r!   old_db_tablespacenew_db_tablespaces       r   alter_db_tablespacez,BaseDatabaseSchemaEditor.alter_db_tablespace  sP    T00__U[[%9%9:"oo.?@"oo.?@4
 
 	r   c           
      B   |j                   rO|j                  j                  j                  j                  r%| j                  |j                  j                        S | j                  ||d      \  }}|y|j                  | j                        }|d   r|d| j                  |z  z   z  }|j                  r| j                  j                  j                  r~|j                  rqd}| j                  r6|j                  j                  j                  j                  }|j                  j                  j                  j!                  |j                  j"                        j$                  }t'        |j                  j                        \  }	}
|d| j                  | j)                  |||      |	rd| j+                  |	      z  nd	| j+                  |j$                        | j+                  |      | j+                  |      | j                  j,                  j/                         d
z  z   z  }n,| j0                  j3                  | j5                  |||             | j6                  | j+                  |j                  j                        | j+                  |j$                        |dz  }| j9                  ||       | j;                  |      sp| j=                  |      _| j?                  |d|d      \  }}| j@                  | j+                  |j                  j                        |dz  }| j9                  ||       | j0                  jC                  | jE                  ||             | j                  j                  jF                  r| j                  jI                          yy)z
        Create a field on a model. Usually involves adding a column, but may
        involve adding a table instead (for M2M fields).
        T)r   Nr\   r]   r^   rb   z%s.rL   )r   	namespacerm   r`   ra   
deferrable)ri   rm   rj   dropri   changes)%r   ru   r   r   r   r   rp   rq   r4   rr   r7   rz   rv   sql_create_column_inline_fkr!   rw   rl   rx   rm   r
   _fk_constraint_namerZ   rY   deferrable_sqlr=   rR   r{   sql_create_columnrA   r   r   _alter_column_default_sqlsql_alter_columnrt   _field_indexes_sqlconnection_persists_old_columnsclose)r:   r!   r   rj   rI   r   constraint_suffixr`   ra   r
  _rF   changes_sqls                r   	add_fieldz"BaseDatabaseSchemaEditor.add_field  s    %"4"4"<"<"B"B"O"O$$U%7%7%?%?@@!__UE4_P
F''4??'C	W# 9 9I EEEJ$//":":"P"PUZUhUh @// --3399BB!..44::DDUEWEWEbEbcjj	/0D0DE	1cD$D$D 44UECTUGP)C!CVX"ooell; $ 9!%!;"&//"5"5"D"D"FH %  
 !!(()<)<UEK\)]^$$__U[[%9%9:ooell3$(
 

 	S&!   'D,B,B5,I,U"&"@"@eZ^"@"_K'')=)=>&+ C LLf%  !8!8!FG??##CCOO!!# Dr   c                    |j                   rO|j                  j                  j                  j                  r%| j                  |j                  j                        S |j                  | j                        d   y|j                  rG| j                  ||j                  gd      }|D ]#  }| j                  | j                  ||             % | j                  | j                  |j                  j                        | j                  |j                        dz  }| j                  |       | j                  j                  j                   r| j                  j#                          t%        | j&                        D ]_  }t)        |t*              s|j-                  |j                  j                  |j                        sE| j&                  j/                  |       a y)z
        Remove a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        r\   r   NTforeign_key)ri   rm   )r   ru   r   r   r   r   rq   r4   r   rm   rA   _delete_fk_sqlsql_delete_columnrZ   rw   r7   r  r  r   r=   r   r   references_columnr   )r:   r!   r   fk_namesfk_namerF   s         r   remove_fieldz%BaseDatabaseSchemaEditor.remove_field  s{    %"4"4"<"<"B"B"O"O$$U%7%7%?%?@@$//:6BJ--eell^QU-VH# BT00@AB $$__U[[%9%9:ooell3(
 
 	S??##CCOO!!#))* 	.C#y)c.C.CEKKDXDXZ_ZfZf.g!!((-	.r   c           
      z   |j                  | j                        }|d   }|j                  | j                        }|d   }||j                  ||j                  t        d|d|d      |||j                  j                  r~|j                  j                  rh|j                  j                  j
                  j                  r>|j                  j                  j
                  j                  r| j                  ||||      S |||j                  j                  rk|j                  j                  rU|j                  j                  j
                  j                  s+|j                  j                  j
                  j                  sy||t        d|d|d      | j                  ||||||||       y)a'  
        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.
        r\   r   Nz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))	rq   r4   ru   r   r   r   r   _alter_many_to_many_alter_field)	r:   r!   r)   r.   strictold_db_paramsold_typenew_db_paramsnew_types	            r   alter_fieldz$BaseDatabaseSchemaEditor.alter_field  s    "//4??/K (!//4??/K ()"8"8"@!i&<&<&D I' 
 ("2&&..93I3I3Q3Q&&..44AA&&..44AA++E9iPP("2&&..93I3I3Q3Q**2288EE**2288EE!1 .7	C  	%Ix'	@r   c	                 0   t               }	| j                  j                  j                  r|j                  r|j
                  r| j                  ||j                  gd      }
|rIt        |
      dk7  r;t        dt        |
      d|j                  j                  d|j                        |
D ]?  }|	j                  |j                  f       | j                  | j                  ||             A |j                  r|j                  r| j!                  ||      r|j                  j"                  D ch c]  }|j$                   }}| j                  ||j                  gdd|      }|rIt        |      dk7  r;t        dt        |      d	|j                  j                  d|j                        |D ]#  }| j                  | j'                  ||             % | j                  j                  j                  xr= |j(                  xr |j(                  xs |j                  xr |j                  xr ||k7  }|ryt+        ||      D ]j  \  }}| j                  |j,                  |j.                  j                  gd      }|D ]-  }| j                  | j                  |j,                  |             / l |j0                  r|j                  s|j0                  r|j                  r|j                  j2                  D ch c]  }|j$                   }}| j                  ||j                  gdt4        j6                  |
      }|D ]#  }| j                  | j9                  ||             % |d   |d   k7  r|d   r|j                  j"                  D ch c]  }|j$                   }}| j                  ||j                  gd|      }|rIt        |      dk7  r;t        dt        |      d|j                  j                  d|j                        |D ]#  }| j                  | j;                  ||             % |j                  |j                  k7  r| j                  | j=                  |j                  j                  |||             | j>                  D ]N  }tA        |tB              s|jE                  |j                  j                  |j                  |j                         P g }g }g }||k7  r9| jG                  ||||      \  }}|jI                  |       |jK                  |       d}|jL                  rj|jL                  s^| jO                  |      }| jO                  |      } | jQ                  |      s+|| k7  r&| $d}|jI                  | jS                  |||             |jL                  |jL                  k7  r&| jU                  |||      }|r|jI                  |       |jW                         xr |jL                  xr |jL                   }!|s|r[|!s||z   }| j                  j                  jX                  r4|r2t[        t]        |       \  }}"dj_                  |      ta        |"g       fg}|D ]J  \  }}"| j                  | jb                  | je                  |j                  j                        |dz  |"       L |!r| j                  | jf                  | je                  |j                  j                        | je                  |j                        ddz   g       |D ]J  \  }}"| j                  | jb                  | je                  |j                  j                        |dz  |"       L |r|D ]  \  }}"| j                  ||"        |j(                  r|j(                  s| ji                  ||       | jk                  ||      r,| j                  | jm                  ||j                  g             |j0                  r|j                  r:|j0                  r.|j                  s"| j                  | jo                  ||g             g }#|r|#jK                  t+        ||             | j!                  ||      r<| j                  | jq                  ||             |#jK                  t+        ||             |#D ]  \  }$}|j.                  js                  | j                        }%|%d   }&| jG                  |j,                  |$j.                  |j.                  |&      \  }}| j                  | jb                  | je                  |j,                  j                  j                        |d   dz  |d          |D ]  \  }}"| j                  ||"         | j                  j                  j                  rT|j                  rH|	s|j                  r|j
                  s.|j
                  r"| j                  | ju                  ||d             |r|jv                  j                  jx                  D ]\  }'t{        |'|      s|'j.                  j
                  s'| j                  | ju                  |'j,                  |'j.                  d             ^ |d   |d   k7  r]|d   rX| j}                  |j                  j                  |j                  gd      }| j                  | j                  |||d                |r_| jS                  |||d      \  }(}"| jb                  | je                  |j                  j                        |(dz  }| j                  ||"       | j                  j                  j                  r| j                  j                          yyc c}w c c}w c c}w )z3Perform a "physical" (non-ManyToMany) field update.Tr  r   r   z!) of foreign key constraints for .F)r   r   r   z) of unique constraints for )r   type_r   r]   )r]   r   z) of check constraints for Nrf   r  r   )ri   rm   r   r\   r   r   rb   _fk_checkr   r  )Bsetr4   r7   rz   ru   rv   r   rm   r   r   r   rw   addrA   r   r   _field_became_primary_keyr~   r   _delete_unique_sqlr   r0   related_modelr   db_indexr   r   r   _delete_index_sql_delete_check_sql_rename_field_sqlr=   r   r   rename_column_references_alter_column_type_sqlrR   rt   r   r   r   r  _alter_column_null_sqlr   supports_combined_altersrS   r/   r   sumr  rZ   sql_update_with_default_delete_primary_key_unique_should_be_addedrn   r   _create_primary_key_sqlrq   r{   r!   related_objectsr   _create_index_name_create_check_sqlr  r  ))r:   r!   r)   r.   r+  r-  r*  r,  r)  fks_droppedr#  r$  rh   r   r   constraint_namedrop_foreign_keys_old_relnew_relrel_fk_namesr   r   index_names
index_namerF   actionsnull_actionspost_actionsfragmentother_actionsneeds_database_defaultold_defaultnew_defaultfour_way_default_alterationrI   rels_to_updateold_relrel_db_paramsrel_typerelr  s)                                            r   r(  z%BaseDatabaseSchemaEditor._alter_field>  s
    eOO$$::""##--ei6F6F5GUY-ZH#h-1, MKK(($$"  
 $ B!1!1 34T00@AB Y%5%59W9WXacl9mGL{{G^G^$_Z__$_!$_#55	(()$E-  6   #./14 ()KK(($$"  
 $4 NT44UOLMN
 OO$$:: '&&@9+@+@ 8!!6i&6&6' h&	 	  &>i%S V!'#55))GMM,@,@+At  6    , VGLL!4!4W5J5JG!TUV	V  i&6&6	@R@RV_VfVf8=8K8KLu

LL 00	(()U\\( 1 K * H
 T33E:FG	H !]7%;;g@VGL{{G^G^$_Z__$_!$_#55	(()-  6   #./14 ()KK(($$"  
 $4 MT33E?KLM y///LL//0D0DiQZ\def(( kc9-001E1EyGWGWYbYiYijk x&*&A&A%T]_g&h#HmNN8$. "'>>)..00;K00;K%%i0{*')-&t==eYPYZ[>>Y^^+225)YOH##H- !!# 4^^2INN 2 	$ l. "L0''@@W#CM2V IIcNCO<=& V))!%1E1E!F#&-   +00!%1E1E!F"&//)2B2B"C#'4 
 !M $0 KCLL--%)__U[[5I5I%J'*1   + *VS&)*   )>)>$$UF3''	9=LL009I9I8JKL ""i&6&6I<N<NW`WgWgLL//	{CD !!":9i"PQ)))Y?LL55eYGH!!":9i"PQ . 	*GW#MM774??7SM$V,H&*&A&A%%w}}gmmX'#Hm LL%%!__W-B-B-H-H-Q-QR'{)    - *VS&)*	*  OO$$::y?U?UI$:$:)BYBY''LL,,UI?_`a ,,<< [(i8SYY=T=TLL!4!4S5F5F		SX!YZ[ !]7%;;g@V"55ekk6J6JYM]M]L^go5pOLL//V]H^_` ""&"@"@	S\cg"@"hK'')=)=>&+ C LLf%??##CCOO!!# D} %`T  M %`s   3n	>nnc                 4   | j                   j                  j                  r|j                         dv ry|j	                  | j                         }|j
                  r| j                  n| j                  }|| j                  |j                        |d   dz  g fS )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.
        )	CharField	TextFieldNr\   r   rm   r   )
r4   r7   r   r|   rq   r   sql_alter_column_nullsql_alter_column_not_nullrZ   rm   )r:   r!   r)   r.   r,  rF   s         r   r?  z/BaseDatabaseSchemaEditor._alter_column_null_sql6  s     OO$$FF++-1KK%33t3OM09$,,DDbDbC"ooi.>.>?)&1   r   c                 v   | j                  |      }| j                  |      }|g}|rg }n3| j                  j                  j                  r| j                  |      }g }|j                  | j                        }|r| j                  n| j                  }	|	| j                  |j                        |d   |dz  |fS )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.
        r\   r   )rm   r   r   )r   r   r4   r7   r   r   rq   sql_alter_column_no_defaultsql_alter_column_defaultrZ   rm   )
r:   r!   r)   r.   r  rX  r   rI   r,  rF   s
             r   r  z2BaseDatabaseSchemaEditor._alter_column_default_sqlL  s     ,,Y7**95F__%%?? **;7GF!//4??/K26d..D<Y<Y//)*:*:;%f-" 
 
 	
r   c                 `    | j                   | j                  |j                        |dz  g fg fS )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 two-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.
        rb  )sql_alter_column_typerZ   rm   )r:   r!   r)   r.   r-  s        r   r>  z/BaseDatabaseSchemaEditor._alter_column_type_sqlk  sE     **"ooi.>.>?$.   	
 		
r   c                    |j                   j                  j                  j                  |j                   j                  j                  j                  k7  rw| j	                  |j                   j                  |j                   j                  j                  j                  |j                   j                  j                  j                         | j                  |j                   j                  |j                   j                  j                  j                  |j                               |j                   j                  j                  j                  |j                                      | j                  |j                   j                  |j                   j                  j                  j                  |j                               |j                   j                  j                  j                  |j                                      y)z*Alter M2Ms to repoint their to= endpoints.N)	ru   r   r   rw   r  r.  rl   m2m_reverse_field_namem2m_field_name)r:   r!   r)   r.   r)  s        r   r'  z,BaseDatabaseSchemaEditor._alter_many_to_many  sr    !!))//88I<R<R<Z<Z<`<`<i<ii	 6 6 > >	@V@V@^@^@d@d@m@m ) 6 6 > > D D M MO 	""** ""**00::9;[;[;]^""**00::9;[;[;]^	
 	""**""**00::9;S;S;UV""**00::9;S;S;UV		
r   rL   c                    t        |      \  }}t        |g|ddi|}| j                  j                  j	                         xs d}|ddj                  |      d|}t        |      |k  r|S t        |      |dz  kD  r|d|dz   }|t        |      z
  dz  dz
  }|d| ddj                  |      d| d|}|d	   dk(  s|d	   j                         rd
|dd z  }|S )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   r   r   zD%s)r
   r	   r4   rY   max_name_lengthr   r   isdigit)	r:   
table_namecolumn_namesr   r  hash_suffix_part
max_lengthrP  other_lengths	            r   rG  z+BaseDatabaseSchemaEditor._create_index_name  s    )4:%1*%V|%VTU%VX^___((88:Ac
#-sxx/EGWX
z?j( :>1/0@qA"S)9%::q@1D}%HH\"=L1

 a=C:a=#8#8#:CR0Jr   c                    |Yt        |      dk(  r|d   j                  r|d   j                  }n,|j                  j                  r|j                  j                  }|(d| j                  j                  j                  |      z   S y)Nr   r   r^   rL   )r   r   r   r4   rY   r   )r:   r!   r   r   s       r   _get_index_tablespace_sqlz2BaseDatabaseSchemaEditor._get_index_tablespace_sql  st     6{aF1I$;$; &q	 7 7** % 9 9$,,;;MJJJr   c                     |rd|z   S y)Nz WHERE rL   rG   )r:   	conditions     r   _index_condition_sqlz-BaseDatabaseSchemaEditor._index_condition_sql  s    y((r   )r   r   usingr   col_suffixesrF   	opclassesr~  c                h     j                  |||      }|D cg c]  }|j                   }}|xs  j                  }|j                  j                  } fd}t        |t        | j                        t        ||||      | j                  ||||	      | j                  |
            S c c}w )z
        Return the SQL statement to create the index for one or several fields.
        `sql` can be specified if the syntax differs from the standard (GIS
        indexes, ...).
        )r   c                  N     j                   | i |j                        S r%   )rG  rZ   )argskwargsr   r:   s     r   create_index_namezEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name  s.    |.t..????4((r   )ri   r   r  r   rJ   r~  )r|  rm   sql_create_indexr   rw   r   r   rZ   r   _index_columnsr  )r:   r!   r   r   r   r  r   r  rF   r  r~  r   r   r   r  ri   r  s   `  `             r   r   z*BaseDatabaseSchemaEditor._create_index_sql  s     77vUb7c-34E5<<447$"7"7$$	) t/5'63DE''wiP //	:
 	
 5s   B/c                     t        |xs | j                  t        |j                  j                  | j
                        | j                  |            S N)ri   r   )r   r   r   r   rw   rZ   )r:   r!   r   rF   s       r   r:  z*BaseDatabaseSchemaEditor._delete_index_sql  sA    (4((,,doo>&
 	
r   c                 4    t        ||| j                  |      S )N)r  )r   rZ   )r:   ri   r   r  r  s        r   r  z'BaseDatabaseSchemaEditor._index_columns  s    ugt\RRr   c                 X   |j                   j                  r,|j                   j                  s|j                   j                  rg S g }|j                   j                  D ]#  }|j                  | j                  ||             % |j                   j                  D ]M  }|D cg c]  }|j                   j                  |       }}|j                  | j                  ||d             O |j                   j                  D ]#  }|j                  |j                  ||              % |S c c}w )z
        Return a list of all index SQL statements (field indexes,
        index_together, Meta.indexes) for the specified model.
        r   r   )r   managedproxyswappedro   rt   r  index_togetherrl   rR   r   r   r   )r:   r!   outputr   r   r   r   s          r   r   z+BaseDatabaseSchemaEditor._model_indexes_sql  s   
 {{""ekk&7&75;;;N;NI[[-- 	AEMM$11%?@	A !;;55 	PK@KLuekk++E2LFLMM$00v0NO	P [[(( 	9EMM%**5$78	9 Ms    "D'c                 r    g }| j                  ||      r"|j                  | j                  ||g             |S )zT
        Return a list of all index SQL statements for the specified field.
        )_field_should_be_indexedrR   r   )r:   r!   r   r  s       r   r  z+BaseDatabaseSchemaEditor._field_indexes_sql  s9     ((6MM$00@Ar   c                 8    |j                   xr |j                   S r%   )r9  r   r:   r!   r   s      r   r  z1BaseDatabaseSchemaEditor._field_should_be_indexed  s    ~~2ell"22r   c                 8    |j                    xr |j                   S r%   r   r:   r)   r.   s      r   r6  z2BaseDatabaseSchemaEditor._field_became_primary_key  s    (((BY-B-BBr   c                     |j                    xr |j                   xs) |j                  xr |j                   xr |j                   S r%   )r   r   r  s      r   rD  z0BaseDatabaseSchemaEditor._unique_should_be_added
  sE    $$$9)9)9 
!!T)*?*?&?TIDTDT	
r   c                     | j                   | j                  |      | j                  |j                        | j                  |j                        |dz  S )N)ri   
old_column
new_columnr   )sql_rename_columnrZ   rm   )r:   ri   r)   r.   r-  s        r   r<  z*BaseDatabaseSchemaEditor._rename_field_sql  sM    %%__U+//)*:*:;//)*:*:;	)
 
 	
r   c           	         t        |j                  j                  | j                        }| j	                  |||      }t        |j                  j                  |j                  g| j                        }t        |j                  j                  j                  j                  | j                        }t        |j                  j                  j                  j                  |j                  j                  g| j                        }| j                  j                  j                         }	t        | j                  ||||||	      S )N)ri   r   rm   r`   ra   r  )r   r   rw   rZ   r  r   rm   target_fieldr!   r4   rY   r  r   sql_create_fk)
r:   r!   r   r   ri   r   rm   r`   ra   r  s
             r   r{   z'BaseDatabaseSchemaEditor._create_fk_sql  s    ekk**DOO<''uf=--~tO++1177@@$//RE..44::CCeFXFXF_F_E`bfbqbqr	__((779
!
 	
r   c                       fd}t        |j                  j                  |j                  gt	        |j
                  j                  j                  j                        d   |j
                  j                  g||      S )Nc                  F    j                   j                  | i |      S r%   rZ   rG  r  r  r:   s     r   create_fk_namezDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_name)  %    ??#:4#:#:D#KF#KLLr   r   )r   r   rw   rm   r
   r  r!   )r:   r!   r   r   r  s   `    r   r  z,BaseDatabaseSchemaEditor._fk_constraint_name(  sk    	M KK  \\NU//55;;DDEaH&&'
 	
r   c                 <    | j                  | j                  ||      S r%   )r   sql_delete_fkr:   r!   r   s      r   r   z'BaseDatabaseSchemaEditor._delete_fk_sql5      **4+=+=udKKr   c                 Z    |y|t         j                  k(  ry|t         j                  k(  ryy )NrL   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   DEFERRED	IMMEDIATE)r:   r  s     r   _deferrable_constraint_sqlz3BaseDatabaseSchemaEditor._deferrable_constraint_sql8  s2    ,,,3---4 .r   c                 |   |r!| j                   j                  j                  sy |r3| j                  ||||      }|r| j                  j                  |       y | j                  dj                  t        | j                  |            | j                  |      dz  }| j                  | j                  |      |dz  S )N)r   r~  rf   )r   r  r   rh   )r4   r7   &supports_deferrable_unique_constraintsrn   r=   rR   sql_unique_constraintr   rT   rZ   r  sql_constraint)r:   r!   r   r   r~  r  rF   rh   s           r   _unique_sqlz$BaseDatabaseSchemaEditor._unique_sql@  s    ((OO ))%di)XC!!((-//yyT__f!=>99*E3
 

 ""OOD)$&
 
 	
r   c           
          |r! j                   j                  j                  sy  fd}t        |j                  j
                   j                        }|#t        |j                  j
                  |d|      }n j                  |      }t        || j                        }|r. j                   j                  j                  sy  j                  }n j                  }t        |||| j                  |       j                  |            S )Nc                  F    j                   j                  | i |      S r%   r  r  s     r   create_unique_namezGBaseDatabaseSchemaEditor._create_unique_sql.<locals>.create_unique_name]  r  r   _uniq)ri   r   r   r~  r  )r4   r7   r  r   r   rw   rZ   r   r   supports_partial_indexessql_create_unique_indexsql_create_uniquer   r  r  )	r:   r!   r   r   r~  r  r  ri   rF   s	   `        r   rn   z+BaseDatabaseSchemaEditor._create_unique_sqlV  s    ((OO	M ekk**DOO<<U[[117GEWXD??4(D%$//:??++DD..C((C//	:66zB
 	
r   c                    |r!| j                   j                  j                  sy |r?| j                   j                  j                  r| j	                  | j
                  ||      S d S | j	                  | j                  ||      S r%   )r4   r7   r  r  r   r   r   )r:   r!   r   r~  r  s        r   r7  z+BaseDatabaseSchemaEditor._delete_unique_sqlu  sw    ((OO ??++DD ++D,A,A5$OJN **4+A+A5$OOr   c                 b    | j                   | j                  |      | j                  d|iz  dz  S )Nr]   r  )r  rZ   rr   )r:   r   r]   s      r   
_check_sqlz#BaseDatabaseSchemaEditor._check_sql  s9    ""OOD)33w6FF&
 
 	
r   c                     t        | j                  t        |j                  j                  | j
                        | j                  |      |      S )N)ri   r   r]   )r   sql_create_checkr   r   rw   rZ   )r:   r!   r   r]   s       r   rH  z*BaseDatabaseSchemaEditor._create_check_sql  s?    !!,,doo>&	
 	
r   c                 <    | j                  | j                  ||      S r%   )r   sql_delete_checkr  s      r   r;  z*BaseDatabaseSchemaEditor._delete_check_sql  s    **4+@+@%NNr   c                     t        |t        |j                  j                  | j                        | j	                  |            S r  )r   r   r   rw   rZ   )r:   templater!   r   s       r   r   z/BaseDatabaseSchemaEditor._delete_constraint_sql  s6    ,,doo>&
 	
r   c
                 B   |2|D 
cg c]'  }
| j                   j                  j                  |
      ) }}
| j                   j                         5 }| j                   j                  j	                  ||j
                  j                        }ddd       g }j                         D ]g  \  }
}|	||d   k(  s|	|d   |k7  r|	|d   |k7  r'|	|d   |k7  r2|	|d   |k7  r=||d   sE|	|d   |k7  rP|	r|
|	vsW|j                  |
       i |S c c}
w # 1 sw Y   xY w)	z@Return all constraint names matching the columns and conditions.Nr   r   r   r   r]   r  r   )	r4   introspectionidentifier_converterrV   get_constraintsr   rw   itemsrR   )r:   r!   rw  r   r   r   r  r]   r1  r   r   rV   r~   resultinfodicts                  r   r   z*BaseDatabaseSchemaEditor._constraint_names  sb    # ) --BB4HL  __##% 	f//77GGPUP[P[PdPdeK	f)//1 	(ND(#|x	7J'J%(8*<*F*x/F+/U$'):e)C$'):e)C*8M3J$&)9U)B$g"5MM$'	(  /	f 	fs   ,D;DDc                     | j                  |d      }|r<t        |      dk7  r.t        dt        |      d|j                  j                        |D ]#  }| j                  | j                  ||             % y )NTr  r   r   z) of PK constraints for )r   r   r   r   rw   rA   _delete_primary_key_sql)r:   r!   r)  r   rJ  s        r   rC  z,BaseDatabaseSchemaEditor._delete_primary_key  s|    11%T1Jc*+q0$%$$    0 	OOLL55e_MN	Or   c                 l   t        | j                  t        |j                  j                  | j
                        | j                  | j                  |j                  j                  |j                  gd            t        |j                  j                  |j                  g| j
                              S )N_pkr   )ri   r   r   )	r   sql_create_pkr   r   rw   rZ   rG  rm   r   r  s      r   rE  z0BaseDatabaseSchemaEditor._create_primary_key_sql  s    ,,doo>''(<(<u||nUZ'[ EKK005<<.$//R
 	
r   c                 <    | j                  | j                  ||      S r%   )r   sql_delete_pkr  s      r   r  z0BaseDatabaseSchemaEditor._delete_primary_key_sql  r  r   c                     | j                   | j                  |      dj                  |      dz  }| j                  |       y )N,)	procedureparam_types)sql_delete_procedurerZ   r   rA   )r:   procedure_namer  rF   s       r   remove_procedurez)BaseDatabaseSchemaEditor.remove_procedure  s=    ''888K0+
 
 	Sr   )FT)rG   )F)rL   r%   r   )NNN)NNNNNNNN)a__name__
__module____qualname____doc__r   r   r  r   r  r  ri  rc  rd  rg  rf  r!  r  rB  r  rr   sql_delete_constraintr  r  r  r  r   r  ry   r  r  r  r  r   r  r  r  r;   r?   rB   rA   rZ   r   rp   r   r   r   staticmethodr   r   rU   r   r   r   r   r   r   r   r   r   r  r  r  r%  r.  r(  r?  r  r>  r'  rG  r|  r  r   r:  r  r   r  r  r6  rD  r<  r{   r  r   r  r  rn   r7  r  rH  r;  r   r   rC  rE  r  r  rG   r   r   r2   r2   ,   sG    AJV5T:CC FP"HN^f@.L9NX,j-	@   "&)M_d,]M)M9UA,.47v/b
  ,W$>". A4B O*S H7$r.<'@T ;@v$p,
>
*
*:
 8<Bb(,24SU$(
:
S&3C



"
L5
,
>P

O
 BFDH:><O
Lr   r2   )loggingr   !django.db.backends.ddl_referencesr   r   r   r   r   django.db.backends.utilsr	   r
   django.db.modelsr   r   django.db.transactionr   r   django.utilsr   	getLoggerrO   r   r"   r0   r2   rG   r   r   <module>r     sS       D . D !			6	71 Uh hr   