
    `?icA                       d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
mZmZmZmZmZ d dlmZmZmZ d dlmZmZ d d	lmZ d d
l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)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                     | 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      p/home/cursorai/projects/django-cronjob-utils/venv/lib/python3.12/site-packages/django/db/backends/base/schema.py_is_relevant_relationr       sG    
 NNE  U__%>00    c                 |    t        | j                  j                  dddd      t        j                  d            S )NFT)forwardreverseinclude_hiddeninclude_parentsr   )key)sorted_meta_get_fieldsoperator
attrgettermodels    r   _all_related_fieldsr/   *   sB    !	 	  	
 ' r!   c              #      K   t         fdt         j                        D        fdt        j                        D              }|D ]3  \  }}||f t        |j                  |j                        E d {    5 y 7 w)Nc              3   :   K   | ]  }t        |      r|  y wNr    ).0obj	old_fields     r   	<genexpr>z+_related_non_m2m_objects.<locals>.<genexpr>;   #      	
;$S)4 ;   c              3   :   K   | ]  }t        |      r|  y wr2   r3   )r4   r5   	new_fields     r   r7   z+_related_non_m2m_objects.<locals>.<genexpr>@   r8   r9   )zipr/   r.   _related_non_m2m_objectsremote_field)r6   r;   related_fieldsold_relnew_rels   ``   r   r=   r=   7   s      	
*9??;	

	
*9??;	
N +w+    
 	
 	
 +	
s   A6B:B;B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e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#dZ$eZ%dZ&dZ'd Z(drd!Z)d" Z*d# Z+dsd%Z,d& Z-d' Z.d( Z/dtd)Z0d* Z1d+ Z2d, Z3d- Z4d. Z5d/ Z6e7d0        Z8d1 Z9d2 Z:d3 Z;d4 Z<d5 Z=d6 Z>d7 Z?d8 Z@d9 ZAd: ZBd; ZCd< ZDd= ZEd> ZFd? ZGd@ ZHdA ZIdtdBZJdC ZK	 dtdDZLdE ZMdtdFZN	 dtdGZOdH ZPdI ZQdJ ZRdK ZSdudMZTdvdNZUdO ZVdP ZWdddLdLdd$dd$ddddQdRZXdvdSZYdT ZZdU Z[dV Z\dW Z]dvdXZ^dY Z_dZ Z`d[ Zad\ Zbd] Zcd^ Zdd_ Zed` Zfda Zg	 	 	 	 	 dwdbZh	 	 	 	 	 	 dxdcZi	 	 	 	 	 	 	 dyddZjdzdeZk	 	 	 	 	 	 dxdfZldg Zmdh Zndi Zodj Zp	 	 	 	 	 	 	 	 d{dkZqdl ZrdtdmZsdn Ztdo Zud|dpZvdsdqZwy)}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)sz2ALTER COLUMN %(column)s TYPE %(type)s%(collation)sz%ALTER COLUMN %(column)s DROP NOT NULLz$ALTER COLUMN %(column)s SET NOT NULLz/ALTER COLUMN %(column)s SET DEFAULT %(default)sz$ALTER COLUMN %(column)s DROP DEFAULTz,ALTER TABLE %(table)s DROP COLUMN %(column)szDALTER TABLE %(table)s RENAME COLUMN %(old_column)s TO %(new_column)szFUPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULLz"UNIQUE (%(columns)s)%(deferrable)szCHECK (%(check)s)z.ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz"CONSTRAINT %(name)s %(constraint)szPRIMARY KEY (%(columns)s)z?ALTER TABLE %(table)s ADD CONSTRAINT %(name)s CHECK (%(check)s)zbALTER TABLE %(table)s ADD CONSTRAINT %(name)s UNIQUE%(nulls_distinct)s (%(columns)s)%(deferrable)sz|ALTER TABLE %(table)s ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) REFERENCES %(to_table)s (%(to_column)s)%(deferrable)sNzQCREATE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(extra)s%(condition)szaCREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(nulls_distinct)s%(condition)sz/ALTER INDEX %(old_name)s RENAME TO %(new_name)szDROP INDEX %(name)szGALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)zDROP PROCEDURE %(procedure)sz)COMMENT ON TABLE %(table)s IS %(comment)sz5COMMENT ON COLUMN %(table)s.%(column)s IS %(comment)sc                     || _         || _        | j                  rg | _        | j                   j                  j                  xr || _        y r2   )
connectioncollect_sqlcollected_sqlfeaturescan_rollback_ddlatomic_migration)selfrE   rF   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 r2   )deferred_sqlrJ   r   rE   alias	__enter__)rK   s    r   rP   z"BaseDatabaseSchemaEditor.__enter__   s>       !6!67DKKK!!#r!   c                     |#| j                   D ]  }| j                  |d         | j                  r| j                  j	                  |||       y y r2   )rN   executerJ   r   __exit__)rK   exc_type	exc_value	tracebacksqls        r   rS   z!BaseDatabaseSchemaEditor.__exit__   sJ    ((S$' )  KK  9i@ !r!    c           	         | j                   sA| j                  j                  r+| j                  j                  j                  st        d      t        |      }t        j                  d||||d       | j                   r|j                         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))paramsrW   )extra; N)rF   rE   in_atomic_blockrH   rI   r   strloggerdebugrstripendswithrG   appendtuplemapquote_valuecursorrR   )rK   rW   rZ   endingrh   s        r   rR   z BaseDatabaseSchemaEditor.execute   s   
   //OO,,==,? 
 #hsFVC2P 	 	
 ::<005R3F!""))5T%5%5v!>??6I ""))#,7'')VsF+ *))s   D::Ec                 L    | j                   j                  j                  |      S r2   )rE   ops
quote_name)rK   r   s     r   rl   z#BaseDatabaseSchemaEditor.quote_name   s    ""--d33r!   c                     j                   j                  D ]U  }|D cg c]  }j                   j                  |       }} j                  j	                   j                  |             W 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 g }|rGj                   j6                  D ]-  } j                  j	                  |j9                                / n/|j                   fdj                   j6                  D               j                   j:                  }t=        |t>              r*|j	                   jA                  |jB                                jD                   j)                  j                   j                         d	jG                  d
 g ||D              dz  }j                   jH                  rC j                  j2                  jK                  j                   jH                        }|r|d|z   z  }||fS c c}w )z-Take a model and return its table definition.rE   check z %s)to_table	to_column_fk_%(to_table)s_%(to_column)s)	AutoFieldBigAutoFieldSmallAutoFieldc              3   B   K   | ]  }|j                          y wr2   )constraint_sql)r4   
constraintr.   rK   s     r   r7   z5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>  s&      #"9J ))%6"9s   , c              3   6   K   | ]  }|rt        |        y wr2   )r_   )r4   	statements     r   r7   z5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>'  s      $!AI I!As   )table
definition)&r)   unique_together	get_fieldrN   rd   _create_unique_sqllocal_fields
column_sqldb_parametersrE   sql_check_constraintdb_type_suffixextendr>   db_constraintr.   db_table
field_namecolumnsql_create_inline_fkrl   rH   supports_foreign_keys_create_fk_sqlget_internal_typerk   autoinc_sqlconstraints
create_sqlpk
isinstancer   _pk_constraint_sqlcolumnssql_create_tablejoindb_tablespacetablespace_sql)rK   r.   field_namesr   fieldscolumn_sqlsrZ   r~   extra_params	db_paramscol_type_suffixrq   rr   r   constraint_sqlsry   r   rW   r   s   ``                 r   	table_sqlz"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 --3399BB!..44::DD&&11&  ,,#(A(A$(OOH$=%)__Y%?E ) # J __--CC%%,,++!5*J  OOELL1 &&( - 
 #oo11==KK((%,, %%,,[9e .p  $kk55
!!(()>)>ud)KL 6 "" #"'++"9"9# 
 [[^^b-.""4#:#:2::#FG##__U[[%9%9:)) $!A;!A!A$ '
 
 ;;$$!__00??))N s^++F{y Ms   "Qc              #   >  K   | |j                  d      x}r| j                  |       |j                  }|j                         r.| j	                  |      \  }	}
d|	  |j                  |
       d}|xr* | j                  |       xr |xr | j                  |       }|rs| j                  |      }|`d| j                  |      z   }| j                  j                  j                  r|| j                  |      z   n| |j                  |       |j                  r.|j                   s"| j                  j                  j"                  rd}|j$                  r*| j'                  |      \  }}|j                  |       | n+|sd n$| j                  j                  j(                  sd |j                   rd n|j*                  rd |j,                  xs |j.                  j,                  }|rU| j                  j                  j0                  r5|j*                  r)| j                  j2                  j5                  |d	       | j                  j                  j6                  r+|j8                  r| j;                  |j8                         y y y w)
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_sqlrE   rH   requires_literal_defaultsprepare_defaultrd   empty_strings_allowedr   !interprets_empty_strings_as_nulls	generated_column_generated_sqlimplied_column_nulluniquer   r)   supports_tablespacesrk   r   supports_comments_inline
db_comment_comment_sql)rK   column_db_typerZ   r.   r   field_db_paramsinclude_defaultr   r   default_sqldefault_paramsdefault_valuecolumn_defaultgenerated_sqlgenerated_params
tablespaces                   r   _iter_column_sqlz)BaseDatabaseSchemaEditor._iter_column_sql7  sR     '++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 )4+?+?+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   JJc           
          |j                  | j                        }|d   }|yg }dj                  | j                  ||||||            |fS )z
        Return the column definition for a field. The field must already have
        had set_attributes_from_name() called.
        rn   typeNNrp   )r   rE   r   r   )rK   r.   r   r   r   r   rZ   s          r   r   z#BaseDatabaseSchemaEditor.column_sqlz  sn      ---I(0!HH%%"##
 
 	
r!   c                      y)z
        Some backends don't accept default values for certain columns types
        (i.e. MySQL longtext and longblob).
        FrX   rK   r   s     r   r   z%BaseDatabaseSchemaEditor.skip_default      
 r!   c                      y)z
        Some backends don't accept default values for certain columns types
        (i.e. MySQL longtext and longblob) in the ALTER COLUMN statement.
        FrX   r   s     r   r   z.BaseDatabaseSchemaEditor.skip_default_on_alter  r   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rK   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.
        %srX   r   s     r   r   z,BaseDatabaseSchemaEditor._column_default_sql  s    
 r!   c                 r    ddl m} |j                  }t        ||      r j	                  |      nd}t        |j                        }|j                   j                        }|j                  |      \  }} j                  j                  j                  r|t         fd|D              z  }g }||z  |fS )z;Return the sql and params for the field's database default.r   )Valuez(%s)r-   rn   c              3   @   K   | ]  }j                  |        y wr2   )r   r4   prK   s     r   r7   z:BaseDatabaseSchemaEditor.db_default_sql.<locals>.<genexpr>  s      I&Q!5!5a!8&   )django.db.models.expressionsr   _db_default_expressionr   r   r   r.   get_compilerrE   compilerH   r   re   )	rK   r   r   
db_defaultrW   querycompilerr   rZ   s	   `        r   r   z'BaseDatabaseSchemaEditor.db_default_sql  s    611
/9*e/LD$$U+RX 	 EKK(%%%A&..z:V??##== 5 I& IIIKF[ &((r!   c                      |j                   j                        \  }}|j                  rdnd} j                  j                  j                  r|t         fd|D              z  }d}d| d| |fS )z3Return the SQL to use in a GENERATED ALWAYS clause.STOREDVIRTUALc              3   @   K   | ]  }j                  |        y wr2   rg   r   s     r   r7   zABaseDatabaseSchemaEditor._column_generated_sql.<locals>.<genexpr>  s     3XQWAD4D4DQ4GQWr   rX   zGENERATED ALWAYS AS (z) )r   rE   
db_persistrH   r   re   )rK   r   expression_sqlrZ   persistency_sqls   `    r   r   z.BaseDatabaseSchemaEditor._column_generated_sql  ss    !&!4!4T__!E&+&6&6(I??##==+e3XQW3X.XXNF&~&6b8IJFRRr!   c                    | j                         r| j                         }|S | j                  rd }|S | j                  s3| j                  r'| j
                  r| j                         dk(  rd}|S d}|S t        | dd      st        | dd      rm| j                         }|dk(  rt        j                         }|S t        j                         }|dk(  r|j                         }|S |d	k(  r|j                         }|S d }|S )
NBinaryFieldr!   r]   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_defaultz+BaseDatabaseSchemaEditor._effective_default  s    '')G( ' __G$ # 0K0K&&(M9    UJ.'%QV2W!335M/",,.  #,,. K/%llnG
 	 #k1%llnG  Gr!   c                 X    |j                  | j                  |      | j                        S )z2Return a field's effective database default value.)get_db_prep_saver   rE   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   rg   z$BaseDatabaseSchemaEditor.quote_value  s     "##r!   c           	      d   | j                  |      \  }}| j                  ||xs d       | j                  j                  j                  r|j
                  j                  r'| j                  |d|j
                  j                         | j                  j                  j                  st|j
                  j                  D ][  }|j                  s|j                  | j                        }|d   } | j                  | j                  ||||j                          ] | 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`.
        Nrn   r   )r   rR   rE   rH   supports_commentsr)   db_table_commentalter_db_table_commentr   r   r   r   _alter_column_comment_sqlrN   r   _model_indexes_sqllocal_many_to_manyr>   throughauto_createdcreate_model)rK   r.   rW   rZ   r   r   
field_types          r   r  z%BaseDatabaseSchemaEditor.create_model  sU   
 nnU+V 	S&.D)??##55{{++++E49U9UV??++DD"[[55E''*/*=*='+ +> + &5V%<
$!;; %uj%:J:J 6 	  !8!8!?@ [[33E!!))//<<!!%"4"4"<"<= 4r!   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.r}   N)r)   r  r>   r  r  delete_modelrR   sql_delete_tablerl   r   listrN   r   r   references_tableremove)rK   r.   r   rW   s       r   r  z%BaseDatabaseSchemaEditor.delete_model  s     [[33E!!))//<<!!%"4"4"<"<= 4
 	!!)=)=>	
 ))*C#y)c.B.B$$/ !!((-	 +r!   c                     |j                   r!| j                  j                  j                  sy| j	                  |j                  ||       d       y)zAdd an index on a model.NrZ   )contains_expressionsrE   rH   supports_expression_indexesrR   r   rK   r.   indexs      r   	add_indexz"BaseDatabaseSchemaEditor.add_index1  sB     &&OO,,HH 	U%%eT24@r!   c                     |j                   r!| j                  j                  j                  sy| j	                  |j                  ||              y)zRemove an index from a model.N)r  rE   rH   r  rR   
remove_sqlr  s      r   remove_indexz%BaseDatabaseSchemaEditor.remove_index<  s<     &&OO,,HHU%%eT23r!   c                     | j                   j                  j                  r9| j                  | j	                  ||j
                  |j
                        d        y | j                  ||       | j                  ||       y )Nr  )rE   rH   can_rename_indexrR   _rename_index_sqlr   r  r  )rK   r.   	old_index	new_indexs       r   rename_indexz%BaseDatabaseSchemaEditor.rename_indexE  sc    ??##44LL&&uinninnM  
 eY/NN5),r!   c                 T    |j                  ||       }|r| j                  |d       yy)zAdd a constraint to a model.Nr  )r   rR   rK   r.   ry   rW   s       r   add_constraintz'BaseDatabaseSchemaEditor.add_constraintO  s.    ##E40 LLTL* r!   c                 P    |j                  ||       }|r| j                  |       yy)z!Remove a constraint from a model.N)r  rR   r!  s       r   remove_constraintz*BaseDatabaseSchemaEditor.remove_constraintW  s(    ##E40LL r!   c                    |D ch c]  }t        |       }}|D ch c]  }t        |       }}|j                  |      D ]#  }| j                  ||ddd| j                         % |j                  |      D ]K  }|D cg c]  }|j                  j                  |       }}| j                  | j                  ||             M 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.
        TF)r   r   N)re   
difference_delete_composed_indexsql_delete_uniquer)   r   rR   r   )	rK   r.   old_unique_togethernew_unique_togetherr   oldsnewsr   r   s	            r   alter_unique_togetherz.BaseDatabaseSchemaEditor.alter_unique_together]  s     -@@,?&f,?@,?@,?&f,?@ood+F''6&&	 ,  ??40K@KLuekk++E2FLLL00?@ 1 A@ M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)r   suffixN)re   r&  r'  sql_delete_indexr)   r   rR   _create_index_sql)	rK   r.   old_index_togethernew_index_togetherr   r+  r,  r   r   s	            r   alter_index_togetherz-BaseDatabaseSchemaEditor.alter_index_togetherr  s     -??,>&f,>?,>?,>&f,>?ood+F''%0%%	 ,  ??40K@KLuekk++E2FLLL//fV/TU 1 @? Ms   C
C "Cc           
      .   |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|}
|j                  d      du rZ|
rX| j                  j                  j                  r8t        | j                  |j                   j                  |	d            }||
v r|g}
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excluder   TFquote   Found wrong number (z) of constraints for (rz   )r   )r)   r   r   indexesr   r   _constraint_namesr   rE   rH   *allows_multiple_constraints_on_same_fieldsr_   _unique_constraint_namer   len
ValueErrorr   rR   _delete_constraint_sql)rK   r.   r   constraint_kwargsrW   ry   meta_constraint_namesmeta_index_namesr   r   constraint_namesdefault_names               r   r'  z/BaseDatabaseSchemaEditor._delete_composed_index  s   .3kk.E.E!
.E
JOO.E 	 !
 ?Dkk>Q>QR>Q
JOO>QRDJKF55;;((/66FK1411
 *,<<
  	
 !!(+t3 ((SS ,,U[[-A-A7RW,XL //$0>  A% ()KK((IIg&	  	T00e=Ma=PQR?!
 SKs   FF,F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)rE   rH   ignores_table_name_caselowerrR   sql_rename_tablerl   rN   r   r   rename_table_references)rK   r.   old_db_tablenew_db_tablerW   s        r   alter_db_tablez'BaseDatabaseSchemaEditor.alter_db_table  s    <'OO$$<<""$(:(:(<<!!!__\:!__\:	
 $$C#y)++L,G %r!   c                    | j                   ry| j                  j                  j                  rX| j	                  | j                   | j                  |j                  j                        | j                  |xs d      dz         y y y )Nr]   )r}   comment)	sql_alter_table_commentrE   rH   r   rR   rl   r)   r   rg   )rK   r.   old_db_table_commentnew_db_table_comments       r   r  z/BaseDatabaseSchemaEditor.alter_db_table_comment  so    ''DOO,D,D,V,VLL,,!__U[[-A-AB#//0D0JK -W'r!   c                     | j                  | j                  | j                  |j                  j                        | j                  |      | j                  |      dz         y)z)Move a model's table between tablespaces.)r}   old_tablespacenew_tablespaceN)rR   sql_retablespace_tablerl   r)   r   )rK   r.   old_db_tablespacenew_db_tablespaces       r   alter_db_tablespacez,BaseDatabaseSchemaEditor.alter_db_tablespace  sQ    '')=)=>"&//2C"D"&//2C"D	
r!   c           
         |j                   rO|j                  j                  j                  j                  r%| j                  |j                  j                        S | j                  ||d      \  }}|y|j                  | j                        x}r|d| z  }|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.                  j1                         d
z  z   z  }n,| j2                  j5                  | j7                  |||             | j8                  | j-                  |j                  j                         | j-                  |j&                        |dz  }| j;                  ||xs d       |j=                         s| j?                  |      sp| jA                  |      _| jC                  |d|d      \  }}| jD                  | j-                  |j                  j                         |dz  }| j;                  ||       |jF                  rp| j                  j                  jH                  rP| j                  j                  jJ                  s0|d   } | j:                  | jM                  ||||jF                          | j2                  jO                  | jQ                  ||             | j                  j                  jR                  r| j                  jU                          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   Nrn   rp   ro   rs   z%s.r]   )r   	namespacer   rq   rr   
deferrable)r}   r   r~   dropr}   changesr   )+r   r>   r  r)   r  r  r   r   rE   r   r   rH   r   r   sql_create_column_inline_fkr.   r   r   r   r   r   _fk_constraint_namerl   rk   deferrable_sqlrN   rd   r   sql_create_columnrR   r   r   r   _alter_column_default_sqlsql_alter_columnr   r   r   r  r   _field_indexes_sqlconnection_persists_old_columnsclose)rK   r.   r   r~   rZ   r   r   constraint_suffixrq   rr   ra  _rW   changes_sqlr	  s                  r   	add_fieldz"BaseDatabaseSchemaEditor.add_field  s    %"4"4"<"<"B"B"O"O$$U%7%7%?%?@@!__UE4_P
F#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	1cD$D$D 44UECTU>G	 ::R"ooell; $ 9!%!;"&//"5"5"D"D"F	H 	% 	 	
 !!((''u6GH $$__U[[%9%9:ooell3$(
 
 	S&.D) $$&..u5&&u-9"&"@"@tU #A #K '')=)=>&+ C LLf% ((::OO,,EE"6*JDLL//5*e.>.> 	  !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.
        rn   r   NTforeign_key)r}   r   )r   r>   r  r)   r  r  r   rE   r?  r   rR   _delete_fk_sqlsql_delete_columnrl   r   rH   rn  ro  r  rN   r   r   references_columnr  )rK   r.   r   fk_namesfk_namerW   s         r   remove_fieldz%BaseDatabaseSchemaEditor.remove_field)  sq    %"4"4"<"<"B"B"O"O$$U%7%7%?%?@@$//:6BJ--eell^QU-VH#T00@A $ $$__U[[%9%9:ooell3(
 
 	S??##CCOO!!#))*C#y)c.C.C$$ell/ !!((-	 +r!   c           
         | j                  ||      sy|j                  | j                        }|d   }|j                  | j                        }|d   }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                  |j                  k7  s%|j                  r|j                  |j                  k7  rd	}	nH|j                  r<	 |j                  | j                        }
|j                  | j                        }|
|k7  }	|	rt	        d
| d      | j                  ||||||||       y# t        $ r d	}	Y 7w xY w)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.
        Nrn   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   rE   r>   rC  r  r)   r  _alter_many_to_manyr   r   r   r   _alter_field)rK   r.   r6   r;   strictold_db_paramsold_typenew_db_paramsnew_typemodifying_generated_fieldold_field_sqlnew_field_sqls               r   alter_fieldz$BaseDatabaseSchemaEditor.alter_fieldI  s~    ,,Y	B!//4??/K (!//4??/K ($)!!7!7!?!7!7!? i)   &&..**22**2288EE**2288EE ++E9iPP &&..**22!..66<<II!..66<<II !1 .7	C 
   I$7$77I$8$8I<P<P$P(,%  K ) 7 7 H
 !* 7 7 H,9],J)$I) UH H 
 			
  1,0)1s   I, ,I:9I:c                     | j                   j                  }|j                  | j                         }d|d<   	 ||j                            |z  S # t        $ r Y y w xY w)N__column_name__r   )rE   data_type_check_constraintsdb_type_parametersr   KeyError)rK   r   r   check_constraintsdatas        r   _field_db_checkz(BaseDatabaseSchemaEditor._field_db_check  sa     !OOGG''8*X	$U%<%<%>?$FF 		s   A 	AAc	           	         t               }	| j                  j                  j                  r|j                  r|j
                  r| j                  ||dh      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+                  d      }|j+                  d      }| j                  j                  j                  xrD |j,                  xr |j,                  xs |j                   xr |j                   xr ||k7  xs ||k7  }|ryt/        ||      D ]j  \  }}| j                  |j0                  |j2                  j                  gd      }|D ]-  }| j                  | j                  |j0                  |             / l |j4                  r|j                   s|j4                  r|j                   r|j                  j6                  D ch c]  }|j&                   }}| j                  ||j                  gdt8        j:                  |      }|D ]#  }| j                  | j=                  ||             % | j?                  ||      }| j?                  ||      }||k7  r|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                  | jA                  ||             % |j                  |j                  k7  r| j                  | jC                  |j                  j                  |||             | jD                  D ]N  }tG        |tH              s|jK                  |j                  j                  |j                  |j                         P g }g }g }|jM                  | j                        } |jM                  | j                        }!||k7  sC| |!k7  s>||k7  s9| j                  j                  jN                  rT|jP                  |jP                  k7  r;| jS                  ||||||      \  }"}#|jU                  |"       |jW                  |#       |jY                         rL|jY                         r|jZ                  |jZ                  k7  rW|jU                  | j]                  |||             n4|jY                         r$|jU                  | j]                  |||d             d	}$|j^                  rz|j^                  sn|jY                         s^| ja                  |      }%| ja                  |      }&| jc                  |      s+|%|&k7  r&|&$d}$|jU                  | je                  |||             |j^                  |j^                  k7  r&| jg                  |||      }"|"r|jU                  |"       |ji                         xs |jY                         xr |j^                  xr |j^                   }'|s|r|'s||z  }| j                  j                  jj                  r9|r7tm        to        |       \  }}(djq                  |      tm        ts        |(       fg}|D ]J  \  }}(| j                  | jt                  | jw                  |j                  j                        |dz  |(       L |'r|jY                         sd})&g}(n| jy                  |      \  })}(| j                  | jz                  | jw                  |j                  j                        | jw                  |j                        |)dz  |(       |D ]J  \  }}(| j                  | jt                  | jw                  |j                  j                        |dz  |(       L |r|D ]  \  }}(| j                  ||(        |j,                  r|j,                  s| j}                  ||       | j                  ||      r"| j                  | j                  ||g             |j4                  r|j                   r;|j4                  r/|j                   s#| j                  | j                  ||g             g }*|r|*jW                  t/        ||             | j#                  ||      r<| j                  | j                  ||             |*jW                  t/        ||             |*D ]!  \  }+}|j2                  j                  | j                        },|,d   }-|,j+                  d      }.|+j2                  j                  | j                        }/|/j+                  d      }0| jS                  |j0                  |+j2                  |j2                  |-|0|.      \  }"}#| j                  | jt                  | jw                  |j0                  j                  j                        |"d   dz  |"d          |#D ]  \  }}(| j                  ||(        $ | j                  j                  j                  rT|j                  rH|	s|j                  r|j
                  s.|j
                  r"| j                  | j                  ||d             |rW|*D ]R  \  }1}2|2j2                  j
                  s| j                  | j                  |2j0                  |2j2                  d             T ||k7  rZ|rX| j                  |j                  j                  |j                  gd      }| j                  | j                  |||d                |$r_| je                  |||d      \  }3}(| jt                  | jw                  |j                  j                        |3d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.r   )ignoreTru  r:  r;  z!) of foreign key constraints for .F)r   r   r7  z) of unique constraints for r   )r  type_r7  )ro   r7  z) of check constraints for rn   rc  Nrz   re  r   )r}   r   r   r   r   r   rs   _fk_checkr0  ro   )IsetrE   rH   r   r>   r   r~  r?  r   rB  rC  r)   r   addrR   rw  r   _field_became_primary_keyr   r   _delete_unique_sqlr   r   r=   related_modelr   db_indexr>  r   r0  _delete_index_sqlr  _delete_check_sql_rename_field_sqlrN   r   r   rename_column_referencesr   r   r   _alter_column_type_sqlrd   r   r   r   "_alter_column_database_default_sqlr   r   r   rk  _alter_column_null_sqlr   supports_combined_altersre   r<   r   r   rl  rl   r   sql_update_with_default_delete_primary_key_unique_should_be_addedr   r2  _create_primary_key_sqlr   r   _create_index_name_create_check_sqlrn  ro  )4rK   r.   r6   r;   r  r  r  r  r  fks_droppedrz  r{  ry   rF  rH  constraint_nameold_collationnew_collationdrop_foreign_keys_old_relrA   rel_fk_namesr  rG  index_names
index_nameold_db_checknew_db_checkrW   actionsnull_actionspost_actionsold_type_suffixnew_type_suffixfragmentother_actionsneeds_database_defaultold_defaultnew_defaultfour_way_default_alterationrZ   r   rels_to_updater@   rel_db_paramsrel_typerel_collationold_rel_db_paramsold_rel_collationrq  relrr  s4                                                       r   r  z%BaseDatabaseSchemaEditor._alter_field  sj    eOO$$::&&''--$~ .  --	(()t . H #h-1,  H,,!((	  $!1!1 34T00@A $   D$B$B9i$X 38++2I2I%2IJ
2I " %  $55!!"!-  6   #./14  ,-,,!((	  $4T44UOLM $4 &))+6%))+6OO$$:: M&&@9+@+@ ;$$9)9)9M
 h&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(()Y ((c9-00,,i.>.>	@P@P ) #22doo2N#22doo2N  /1-((::((I,@,@@ '+&A&Ay)X}m'#Hm NN8$.##%,,.''9+?+??;;E9iX %%'NN779id 8  "'>>)..9Q9Q9S00;K00;K..y9;.+)-&225)YO >>Y^^+225)YOH##H- !!#Ay'?'?'A'6~~4inn"4 	$ l. <'''@@W#CM2V IIcNE%.,ABC&V))!%1E1E!F#&
   ' + //1"&K)]F*.*=*=i*H'K00!%1E1E!F"&//)2B2B"C#.  $0KCLL--%)__U[[5I5I%J'*
  $0 +VS&)  ,   )>)>$$UF3''	9=LL00DE ##y'7'7""$$LL//yk/JK !!":9i"PQ)))Y?LL55eYGH!!":9i"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##E96VW (399**LL++C,=,=syy%P ) <'L"55$$y'7'7&8 6 O LL&&uo}W?UV
 ""&"@"@y)$ #A #K '')=)=>&+ C LLf%??##CCOO!!# DI
%v  M&%s   u<u+uc                 (   | j                   j                  j                  r|j                  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.
        Nrn   r   )r   r   )
rE   rH   r   r   r   r   sql_alter_column_nullsql_alter_column_not_nullrl   r   )rK   r.   r6   r;   r  rW   s         r   r  z/BaseDatabaseSchemaEditor._alter_column_null_sql  s     OO$$FF// %33t3OM >> **33  "ooi.>.>?)&1
  r!   c                    | j                  |      }| j                  |      }|g}|rg }n3| j                  j                  j                  r| j                  |      }g }|j                  | j                        }|r&|j                  r| j                  }	n| 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.
        rn   r   r   r   r   )r   r   rE   rH   r   r   r   r    sql_alter_column_no_default_nullsql_alter_column_no_defaultsql_alter_column_defaultrl   r   )
rK   r.   r6   r;   rd  r  r   rZ   r  rW   s
             r   rk  z2BaseDatabaseSchemaEditor._alter_column_default_sql7  s     ,,Y7**95F__%%?? **;7GF!//4??/K~~;;66//C//)*:*:;%f-" 
 	
r!   c                     |r| j                   }d}g }n | j                  }| j                  |      \  }}|j                  | j                        }|| j                  |j                        |d   |dz  |fS )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.
        r]   rn   r   r  )r  r  r   r   rE   rl   r   )	rK   r.   r6   r;   rd  rW   r   rZ   r  s	            r   r  z;BaseDatabaseSchemaEditor._alter_column_database_default_sql]  s     22CKF//C"&"5"5i"@K!//4??/K//)*:*:;%f-& 
 	
r!   c                    g }| j                  |||j                  j                        x}rd| }nd}d}	| j                  j                  j
                  r|j                  sv|j                  |j                  k7  r6| j                  ||||j                        \  }
}|
r|j                  |
|f       |j                  r| j                  |j                        }	| j                  | j                  |j                        |||	dz  g f|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 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.
        rp   r]   )r   r   r   rU  )r   r)   r   rE   rH   r   r   r   r  rd   r   sql_alter_column_typerl   r   )rK   r.   r6   r;   r  r  r  r  collate_sqlcomment_sqlrW   rZ   s               r   r  z/BaseDatabaseSchemaEditor._alter_column_type_sqly  s    ++=%++*>*>
 
; 
 k]+KK??##55i>T>T##y';';; #<<9h	0D0DV !((#v7##"//	0D0DE **"ooi.>.>?$!,*	 	 
 	
r!   c                     | j                   | j                  |j                  j                        | j                  |j                        | j                  |      dz  g fS )N)r}   r   rU  )sql_alter_column_commentrl   r)   r   r   r   )rK   r.   r;   r  new_db_comments        r   r  z2BaseDatabaseSchemaEditor._alter_column_comment_sql  sZ    )))=)=>//)*:*:;,,^< 
 	
r!   c                 ,    | j                  |xs d      S )Nr]   r   )rK   rU  s     r   r   z%BaseDatabaseSchemaEditor._comment_sql  s    2..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)	r>   r  r)   r   rS  r  r   m2m_reverse_field_namem2m_field_name)rK   r.   r6   r;   r  s        r   r  z,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!   r]   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      rq     N   r:  r   zD%s)r   r   rE   rk   max_name_lengthr   rB  isdigit)	rK   
table_namecolumn_namesr0  rq  hash_suffix_part
max_lengthr  other_lengths	            r   r  z+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                 P   |zt        |      dk(  r|d   j                  r|d   j                  }nMt        j                  rt        j                  }n,|j                  j                  r|j                  j                  }|(d| j
                  j                  j                  |      z   S y)Nr:  r   rp   r]   )rB  r   r   DEFAULT_INDEX_TABLESPACEr)   rE   rk   r   )rK   r.   r   r   s       r   _get_index_tablespace_sqlz2BaseDatabaseSchemaEditor._get_index_tablespace_sql  s     6{aF1I$;$; &q	 7 722 ( A A** % 9 9$,,;;MJJJr!   c                     |rd|z   S y)Nz WHERE r]   rX   )rK   	conditions     r   _index_condition_sqlz-BaseDatabaseSchemaEditor._index_condition_sql  s    y((r!   c                     |r | j                   j                  j                  syt        dt	        |j
                  j                  || j                              S )Nr]   z INCLUDE (%(columns)s))r   )rE   rH   supports_covering_indexesr   r   r)   r   rl   )rK   r.   r   s      r   _index_include_sqlz+BaseDatabaseSchemaEditor._index_include_sql  sD    doo66PP$EKK00'4??K
 	
r!   )r   r   r0  usingr   col_suffixesrW   	opclassesr  includeexpressionsc                $    |xs g }|xs g }t        |d      j                   j                        } j                  |||      }|D cg c]  }|j                   }}|xs  j
                  }|j                  j                  } fd}t        |t        | j                        t        ||||      ||r j                  ||||	      nt        ||| j                        | j                  |
       j!                  ||            S c c}w )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_colsrn   )r   c                  N     j                   | i |j                        S r2   )r  rl   )argskwargsr   rK   s     r   create_index_namezEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name0  s.    |.t..????4((r!   )r}   r   r  r   r[   r  r  )r   r   rE   r  r   sql_create_indexr)   r   r   r   rl   r
   _index_columnsr   rg   r  r  )rK   r.   r   r   r0  r  r   r  rW   r  r  r  r  r   r   r   r   r  r}   r  s   `  `                r   r2  z*BaseDatabaseSchemaEditor._create_index_sql  s   * 2!'R51>> ? 
 776 8 
 .44VE5<<V47$"7"7$$	) t/5'63DE  ##E7L)L Xt?O?OP //	:++E7;
 	
 5s   Dc                    t        |xs | j                  t        |j                  j                  | j
                        | j                  |            }|j                  d   j                  }|j                  d   }t        | j                        D ]A  }t        |t               s|j                  ||      s'| j                  j                  |       C |S )Nr}   r   r}   r   )r   r1  r   r)   r   rl   partsr}   r  rN   r   references_indexr  )rK   r.   r   rW   r|   r  r  s          r   r  z*BaseDatabaseSchemaEditor._delete_index_sqlE  s    (4((,,doo>&
	 __W-33
__V,
))*C#y)c.B.BJ/ !!((-	 + r!   c                     t        | j                  t        |j                  j                  | j
                        | j                  |      | j                  |            S )N)r}   old_namenew_name)r   sql_rename_indexr   r)   r   rl   )rK   r.   r	  r
  s       r   r  z*BaseDatabaseSchemaEditor._rename_index_sqlW  sH    !!,,doo>__X.__X.	
 	
r!   c                 4    t        ||| j                  |      S )N)r  )r   rl   )rK   r}   r   r  r  s        r   r  z'BaseDatabaseSchemaEditor._index_columns_  s    ugt\RRr!   c                    |j                   j                  r,|j                   j                  s|j                   j                  rg S g }|j                   j                  D ]#  }|j                  | j                  ||             % |j                   j                  D ]P  }|j                  r!| j                  j                  j                  s0|j                  |j                  ||              R |S )zz
        Return a list of all index SQL statements (field indexes, Meta.indexes)
        for the specified model.
        )r)   managedproxyswappedr   r   rm  r>  r  rE   rH   r  rd   r   )rK   r.   outputr   r  s        r   r  z+BaseDatabaseSchemaEditor._model_indexes_sqlb  s    
 {{""ekk&7&75;;;N;NI[[--EMM$11%?@ . [[((E..??++GGe..ud;< ) r!   c                 t    g }| j                  ||      r#|j                  | j                  ||g             |S )zT
        Return a list of all index SQL statements for the specified field.
        r  )_field_should_be_indexedrd   r2  )rK   r.   r   r  s       r   rm  z+BaseDatabaseSchemaEditor._field_indexes_sqlu  s<     ((6MM$00w0GHr!   c                 d   |j                   s%|j                  s|j                   s|j                  sy|xs
 t               }|j                         \  }}}}|j                         \  }}}	}
|j	                  |j
                        D ]  }|j                  |d         |j	                  |j
                        D ]  }|
j                  |d         |j                  s|j                  r|j                  ry|j                  j                  j                  j                  |j                  j                  j                  j                  k(  r$|j                  dd        |
j                  dd        |j                  d      rV|
j                  d      rE| j                  |      | j                  |      k(  r"|j                  d       |
j                  d       |j                   xrE |j                   xr7 | j                  |j                        | j                  |j                        k7  xs |||f||	|
fk7  S )NFtor   )concreter   r  deconstructunionnon_db_attrspopr>   r.   r)   r   r   r   rl   r   )rK   r6   r;   r  rq  old_pathold_args
old_kwargsnew_pathnew_args
new_kwargsattrs               r   r~  z1BaseDatabaseSchemaEditor._field_should_be_altered~  s   ##y'='=##y'='=35,5,A,A,C)8Xz,5,A,A,C)8Xz LL!7!78DNN4& 9LL!7!78DNN4& 9 &&&&&&&&,,22;;%%++11::; NN4&NN4& NN<(|,##I.$2E2Ei2PPNN<(NN<( Y""Y!1!12dooiFVFV6WWR *-(Hj1QQ		Rr!   c                 8    |j                   xr |j                   S r2   )r  r   rK   r.   r   s      r   r  z1BaseDatabaseSchemaEditor._field_should_be_indexed  s    ~~2ell"22r!   c                 8    |j                    xr |j                   S r2   r   rK   r6   r;   s      r   r  z2BaseDatabaseSchemaEditor._field_became_primary_key  s    (((BY-B-BBr!   c                 r    |j                    xr) |j                  xr |j                   xs |j                   S r2   )r   r   r&  s      r   r  z0BaseDatabaseSchemaEditor._unique_should_be_added  s?    %%% @  @%%%>)>)>	
r!   c                     | j                   | j                  |      | j                  |j                        | j                  |j                        |dz  S )N)r}   
old_column
new_columnr   )sql_rename_columnrl   r   )rK   r}   r6   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)r}   r   r   rq   rr   rb  )r   r)   r   rl   rh  r   r   target_fieldr.   rE   rk   ri  r   sql_create_fk)
rK   r.   r   r0  r}   r   r   rq   rr   rb  s
             r   r   z'BaseDatabaseSchemaEditor._create_fk_sql  s    ekk**DOO<''uf=--~tO++1177@@$//R$$**33&&'OO
	
 __((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 r2   rl   r  r  r   rK   s     r   create_fk_namezDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_name  s%    ??#:4#:#:D#KF#KLLr!   r:  )r	   r)   r   r   r   r-  r.   )rK   r.   r   r0  r3  s   `    r   rh  z,BaseDatabaseSchemaEditor._fk_constraint_name  sk    	M KK  \\NU//55;;DDEaH&&'
 	
r!   c                 <    | j                  | j                  ||      S r2   )rD  sql_delete_fkrK   r.   r   s      r   rw  z'BaseDatabaseSchemaEditor._delete_fk_sql      **4+=+=udKKr!   c                 Z    |y|t         j                  k(  ry|t         j                  k(  ryy )Nr]   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   DEFERRED	IMMEDIATE)rK   rb  s     r   _deferrable_constraint_sqlz3BaseDatabaseSchemaEditor._deferrable_constraint_sql  s2    ,,,3---4 .r!   c                     |du ry|du ryy)NFz NULLS NOT DISTINCTTz NULLS DISTINCTr]   rX   )rK   nulls_distincts     r    _unique_index_nulls_distinct_sqlz9BaseDatabaseSchemaEditor._unique_index_nulls_distinct_sql  s    U"(t#$r!   c                    | xs  | j                   j                  j                  xr | xs  | j                   j                  j                  xrt | xs  | j                   j                  j                  xrM | xs  | j                   j                  j
                  xr& |d u xs  | j                   j                  j                  S r2   )rE   rH   supports_partial_indexes&supports_deferrable_unique_constraintsr  r  *supports_nulls_distinct_unique_constraints)rK   r  rb  r  r  r=  s         r   _unique_supportedz*BaseDatabaseSchemaEditor._unique_supported  s     ]Odoo66OO  S??++RR
 R 8 8 R R  W4??#;#;#W#W $& W??++VV	
r!   c
           
         | j                  |||||	      sy |s|s|s|s|	7| j                  ||||||||	      }
|
r| j                  j                  |
       y | j                  dj                  |D cg c]  }| j                  |j                         c}      | j                  |      dz  }| j                  | j                  |      |dz  S c c}w )Nr  rb  r  r  r=  )r   r  r  r  r  r=  rz   )r   rb  r   ry   )
rC  r   rN   rd   sql_unique_constraintr   rl   r   r;  sql_constraint)rK   r.   r   r   r  rb  r  r  r  r=  rW   r   ry   s                r   _unique_sqlz$BaseDatabaseSchemaEditor._unique_sql  s    %%!#) & 
  ) ))##'- * 	C !!((-//yyV!TVE$//%,,"?V!TU99*E3
 

 ""OOD)$&
 
 	
 "Us   3"C
c
                    | j                  |||||	      sy t        |d      j                  | j                        }
|j                  j
                  }|D cg c]  }|j                   }}|| j                  ||d      }n| j                  |      }|s|s|s|r| j                  }n| j                  }|r| j                  ||d|      }nt        |||
| j                        }t        |t        || j                        ||| j!                  |      | j#                  |      | j%                  ||      | j'                  |	      	      S c c}w )
NrE  Fr  rn   Tr8  rX   )r  r  )r}   r   r   r  rb  r  r=  )rC  r   r   rE   r)   r   r   rA  rl   sql_create_unique_indexsql_create_uniquer  r   rg   r   r   r  r;  r  r>  )rK   r.   r   r   r  rb  r  r  r  r=  r   r}   r   r   rW   s                  r   r   z+BaseDatabaseSchemaEditor._create_unique_sql<  s\    %%!#) & 
 51>> ? 
 $$-34VE5<<V4<//wd/KD??4(D9..C((C))wR9 * G "%h@P@PQGt///	:66zB++E7;@@P	
 		
 5s   Ec                 H     |r fd}n j                   }t        ||d|      S )Nc                  F    j                   j                  | i |      S r2   r1  r2  s     r   create_unique_namezLBaseDatabaseSchemaEditor._unique_constraint_name.<locals>.create_unique_namer  s%    '>t'>'>'O'OPPr!   _uniq)r  r
   )rK   r}   r   r9  rO  s   `    r   rA  z0BaseDatabaseSchemaEditor._unique_constraint_nameo  s,    Q "&!8!82DEEr!   c	                     | j                  |||||      sy |s|s|s|r| j                  }	n| j                  }	| j                  |	||      S )NrE  )rC  r1  r(  rD  )
rK   r.   r   r  rb  r  r  r  r=  rW   s
             r   r  z+BaseDatabaseSchemaEditor._delete_unique_sqlz  s_     %%!#) & 
 9''C((C**3t<<r!   c                 b    | j                   | j                  |      | j                  d|iz  dz  S )Nro   rF  )rH  rl   r   )rK   r   ro   s      r   
_check_sqlz#BaseDatabaseSchemaEditor._check_sql  s9    ""OOD)33w6FF&
 
 	
r!   c                     | j                   j                  j                  sy t        | j                  t        |j                  j                  | j                        | j                  |      |      S )N)r}   r   ro   )	rE   rH    supports_table_check_constraintsr   sql_create_checkr   r)   r   rl   )rK   r.   r   ro   s       r   r  z*BaseDatabaseSchemaEditor._create_check_sql  sU    ''HH!!,,doo>&	
 	
r!   c                 ~    | j                   j                  j                  sy | j                  | j                  ||      S r2   )rE   rH   rU  rD  sql_delete_checkr6  s      r   r  z*BaseDatabaseSchemaEditor._delete_check_sql  s3    ''HH**4+@+@%NNr!   c                     t        |t        |j                  j                  | j                        | j	                  |            S )Nr  )r   r   r)   r   rl   )rK   templater.   r   s       r   rD  z/BaseDatabaseSchemaEditor._delete_constraint_sql  s6    ,,doo>&
 	
r!   c
           
      $   ||D 
cg c]  }
| j                   j                  j                  rQ| j                   j                  j	                  t        |
| j                   j                  j                                     n$| 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  ro   rv  r   )rE   rH   truncates_namesintrospectionidentifier_converterr   rk   r  rh   get_constraintsr)   r   itemsrd   )rK   r.   r  r   r   r  rv  ro   r  r7  r   rh   r   resultinfodicts                  r   r?  z*BaseDatabaseSchemaEditor._constraint_names  s    # )	 )D //?? OO11FF%dDOO,?,?,O,O,QR 66KKDQ	R )  	 __##%//77GG,,K & )//1ND(#|x	7J'J%(8*<*F*x/F+/U$'):e)C$'):e)C*8M3J$&)9U)B$g"5MM$' 2  ?	 &%s   BF ;FFc                 V      j                   ddj                   fd|D              iz  S )Nr   rz   c              3   @   K   | ]  }j                  |        y wr2   rl   )r4   r   rK   s     r   r7   z>BaseDatabaseSchemaEditor._pk_constraint_sql.<locals>.<genexpr>  s      OwV!8wr   )sql_pk_constraintr   )rK   r   s   ` r   r   z+BaseDatabaseSchemaEditor._pk_constraint_sql  s/    %%tyy Ow OO)
 
 	
r!   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?  rB  rC  r)   r   rR   _delete_primary_key_sql)rK   r.   r  rH  r  s        r   r  z,BaseDatabaseSchemaEditor._delete_primary_key  sw    11%T1Jc*+q0 ()KK((   0OLL55e_MN  0r!   c                 l   t        | j                  t        |j                  j                  | j
                        | j                  | j                  |j                  j                  |j                  gd            t        |j                  j                  |j                  g| j
                              S )N_pkr  )r}   r   r   )	r   sql_create_pkr   r)   r   rl   r  r   r   r#  s      r   r  z0BaseDatabaseSchemaEditor._create_primary_key_sql  s    ,,doo>''KK((5<<. ( 
 EKK005<<.$//R	
 		
r!   c                 <    | j                  | j                  ||      S r2   )rD  sql_delete_pkr6  s      r   rh  z0BaseDatabaseSchemaEditor._delete_primary_key_sql  r7  r!   c                 2    |rd| j                  |      z   S dS )NzCOLLATE r]   re  )rK   r   r  r  s       r   r   z%BaseDatabaseSchemaEditor._collate_sql  s    :CzDOOI66KKr!   c                     | j                   | j                  |      dj                  |      dz  }| j                  |       y )N,)	procedureparam_types)sql_delete_procedurerl   r   rR   )rK   procedure_namerr  rW   s       r   remove_procedurez)BaseDatabaseSchemaEditor.remove_procedure  s=    ''888K0+
 
 	Sr!   )FT)rX   )F)r]   r2   )NNNNN)NNNNNN)NNNNNNN)T)NNNNNNNNr   )x__name__
__module____qualname____doc__r   rO  r\  r  rj  rl  r  r  r  r  r  r  rx  r+  r  rG  r   sql_delete_constraintrH  rf  rV  rX  rL  r(  r.  r   rg  r5  r  rK  r  r1  rk  rm  rs  rV  r  rL   rP   rS   rR   rl   r   r   r   r   r   r   r   r   r   staticmethodr   r   rg   r  r  r  r  r  r"  r$  r-  r5  r'  rS  r  r_  rs  r|  r  r  r  r  rk  r  r  r  r   r  r  r  r  r  r2  r  r  r  r  rm  r~  r  r  r  r  r   rh  rw  r;  r>  rC  rI  r   rA  r  rS  r  r  rD  r?  r   r  r  rh  r   ru  rX   r!   r   rC   rC   N   sc    AJV5T:PC FP"H'B$FN  	Q  A.L9N3X,	?  .	@   "&)M	9 
	B  I, 	R  *M9IVUA,>4aJA6F
6
)&S  2W$!>F.*	A4-+A*V* SDH&	
V$p.@Q
f	( q$f:$
N 16
8,
\	
/
B@


 4
l$
S&'RR3C


*
L5 
: 2
p 1
f	F =2

O

 -^

O

LLr!   rC   )&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   	getLoggerr`   r    r/   r=   rC   rX   r!   r   <module>r     sg          -  S R . A & D !			6	71 

.y yr!   